JRT和springboot比较测试

想要战胜他,必先理解他。这两天系统的学习Maven和跑springboot工程,从以前只是看着复杂,现在到亲手体验一下,亲自实践的才是更可靠的了解。

第一就是首先Maven侵入代码结构,代码一般要按约定搞src/main/java。如果是能严格执行测试的项目用着还行,需求性的项目测试根本跟不上,多增加层级就是增加负担。

第二就是Maven所带来的好处和所需要的环境配置和学习成本不匹配,增加学习成本,好处并没有绝对优势,当然如果架构没解决业务脚本化的问题,那么不同模块之间肯定相互引用很多,这时候是有优势的。所以根源不是Maven有多好、而是没解决业务编码便捷性问题,为了解决这个问题而引入的新问题,还要鼓吹有多好。然后就是Maven编译打包Spring太慢了,每个操作都要一分钟起,给喝咖啡带来了充分的时间。

同时经过测试发现Spring启动后太费内存了,什么都不做内存就占用1700兆了,同等启动的JRTWeb占用137兆,相差10倍以上。用多余内存给DolerGet做缓存用不香吗,多用的内存都能内存缓存千万级别的数据了。

然后就是环境太复杂,又要配Maven,又要运行ridis,又要运行nginx配置代理,还没进入开发过程就能浪费两天时间,发布还得再额外学。针对单体机构的软件真的有必要像互联网那样用ridis那些么?杀鸡焉用牛刀,部署的时候也得额外安装ridis(麻烦的要死)。

实现原理上Spring和JRT基本一致,只是面向发布和开发理念不同。两者都是内嵌Web服务器,然后按请求的url执行对应的业务类。不同的是Spring按注解反射初始化容器,按url通过注解从容器取对象执行。JRT按业务脚本目录给每个业务编译jar包,按请求url执行对应jar,理论上应该是JRT执行效率更高,因为不需要解析注解那些,直接按路径得到类全面执行就行了。注解用的好确实是简化程序,但是什么都注解也不一定好,感觉Spring用点过渡注解的意思。综合就是Spring流程定义更全面和规范、用着更复杂更加重量级,一个开发要全面掌控不容易。JRT更注重简化业务和环境,要哪些就做哪些,不引入多余的东西,可以达到一个开发全面掌控的效果。

Springboot编译用了55秒
在这里插入图片描述

用cmd启动要1分钟开外
在这里插入图片描述
idea启动用了52秒
在这里插入图片描述

JRT网站在5秒编译和启动完成,并用谷歌打开指定的页面
在这里插入图片描述

springboot网站启动后占用的内存
在这里插入图片描述

JRT网站启动后占用的内存
在这里插入图片描述

Spring启动定制测试程序。由于这个springboot的前后台分离没做到分而不离,所以需要nginx代码前端后后台来避免跨域,因此启动网站之前需要启动nginx,同时又依赖了ridis,这里一起给启动了。

package xxxxxx;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.Properties;@ServletComponentScan(basePackages = "com.xxxxxx")
@MapperScan(basePackages = {"xxxxx.**.mapper"})
@SpringBootApplication
@EnableAsync
public class LimpApplication {public static void main(String[] args) {//尝试启动相关软件try {if (IsOSLinux() == false) {System.out.println("检查D:\\nginx-1.23.2是否存在,尝试启动nginx");File niginx = new File("D:\\nginx-1.23.2\\nginx.exe");if (niginx.exists()) {System.out.println("存在nginx,尝试启动");StartExe(niginx.toString(), "D:\\nginx-1.23.2");}System.out.println("检查D:\\Redis-x64-3.2.100是否存在,尝试启动ridis");File ridis = new File("D:\\Redis-x64-3.2.100\\start.bat");if (ridis.exists()) {System.out.println("存在ridis,尝试启动");StartExe(ridis.toString(), "D:\\Redis-x64-3.2.100");}}}catch (Exception ex){}//启动前先启动ridis和nginxSpringApplication.run(LimpApplication.class, args);}/*** 判断OS** @return 得到是否是Linux*/public static boolean IsOSLinux() {Properties prop = System.getProperties();String os = prop.getProperty("os.name");if (os != null && os.toLowerCase().indexOf("linux") > -1) {return true;} else {return false;}}/*** 启动Exe* @param cmdStr 命令串* @param runDir 运行路径*/private static void StartExe(String cmdStr,String runDir){File directory = new File(runDir);try{System.out.println("启动:"+cmdStr);// 创建进程并执行命令Process process = Runtime.getRuntime().exec(cmdStr,null,directory);}catch (Exception ex){System.out.println(ex.getMessage());}}}

由于很多开发不知道启动后该打开那个url使用,所以需要在Spring启动后执行一个逻辑,用谷歌打开特定页面

package xxxxxxx;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;/*** 启动后执行,打开登录页面等*/
@Component
public class SpringBootApplicationRunner implements ApplicationRunner {/*** 启动后执行的逻辑* @param args* @throws Exception*/@Overridepublic void run(ApplicationArguments args) throws Exception {//打开页面辅助器OpenUrl("http://localhost:8527/imedicallis-hos/imedicallis/webui/test/form/demoHtml.html");}/*** 打印页面** @param url 路径* @throws Exception*/public static void OpenUrl(String url) throws Exception {//获取操作系统类型String os = System.getProperty("os.name").toLowerCase();//根据操作系统类型调用不同的命令if (os.contains("win")) {String path = GetChromePath();if (!path.isEmpty()) {File file = new File(path);if (file.exists()) {//使用Runtime.exec执行命令Runtime.getRuntime().exec(path + " "+ url);return;}}//使用Runtime.exec执行命令Runtime.getRuntime().exec("cmd /c start " + url);} else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {//Linux or Mac//使用ProcessBuilder创建一个进程ProcessBuilder pb = new ProcessBuilder("google-chrome", url);Process p = pb.start();} else {System.out.println("Unsupported OS");}}/*** 得到谷歌程序地址** @return* @throws Exception*/private static String GetChromePath() throws Exception {String path = GetExeRegedit("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe");if (path.isEmpty()) {path = GetExeRegedit("HKEY_LOCAL_MACHINE\\HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe");}if (!path.isEmpty()) {path += "\\chrome.exe";}return path;}/*** 得到注册表值** @param path 执行路径* @return* @throws Exception*/private static String GetExeRegedit(String path) throws Exception {Process ps = null;//当路径中有空格时,要把路径打上引号。ps = Runtime.getRuntime().exec("reg query \"" + path + "\"");ps.getOutputStream().close();InputStreamReader i = new InputStreamReader(ps.getInputStream());String line;BufferedReader ir = new BufferedReader(i);String ret = "";while ((line = ir.readLine()) != null) {if (line.contains("Path")) {String[] arr = line.split("    ");ret = arr[arr.length - 1];}}return ret;}
}

逻辑都是参照JRT启动来的,JRT的启动引导

package WebLoader;import JRT.Core.Util.LogUtils;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.*;
import java.net.Socket;
import java.nio.file.Paths;
import java.util.Scanner;/*** 网站加载器,参照操作系统引导概念,引导加载网站*/
public class Main {/*** 加载入口* @param args*/public static void main(String[] args) {//站点名称String WebName="JRTWeb";//自动打开的页面String OpenUrlStr="https://localhost:8081/JRTWeb/sys/form/frmCodeTableManager.aspx";boolean isWin=true;System.out.println("本控制台将负责引导启动网站");try{String osName = System.getProperty("os.name");String StartCmd="startup.bat";String ShutdownCmd="shutdown.bat";//判断Windowsif(osName != null && !osName.startsWith("Windows")) {isWin=false;StartCmd="startup.sh";ShutdownCmd="shutdown.sh";}File directory = new File("");// 参数为空String courseFile = directory.getCanonicalPath();System.out.println(courseFile);String binPath= Paths.get(courseFile,"WebSrc","bin").toString();String stopBatPath= Paths.get(courseFile,"WebSrc","bin",ShutdownCmd).toString();String startBatPath= Paths.get(courseFile,"WebSrc","bin",StartCmd).toString();if(isWin==true) {//结束打开页面工具KillProcess("DevOpenPage.exe");}System.out.println("尝试停止站点");System.out.println("执行脚本:"+stopBatPath);TryExecCmd(stopBatPath,binPath);//存在就删除File jrtOkFile=new File(Paths.get(courseFile,"WebSrc","webapps","JRTWeb","jrt.ok").toString());//不存在就创建,网站启动成功会删除if(!jrtOkFile.exists()){jrtOkFile.createNewFile();}//用线程打开页面ThreadOpenUrl(jrtOkFile,OpenUrlStr);System.out.println("尝试启动站点");System.out.println("执行脚本:"+startBatPath);TryExecCmd(startBatPath,binPath);}catch (Exception ex){System.out.println(ex.getMessage());}}/*** 打开页面* @param jrtOkFile 成功文件* @param OpenUrlStr 打开地址* @throws Exception*/private static void ThreadOpenUrl(File jrtOkFile,String OpenUrlStr) throws Exception{Thread thread = new Thread(new Runnable() {@Overridepublic void run() {try {int tryNum = 0;//等待网站启动while (true) {tryNum++;//标志文件没了就是网站启动了if (!jrtOkFile.exists()) {break;}if (tryNum > 200) {break;}Thread.sleep(100);}//打开页面辅助器OpenUrl("https://localhost:8081/JRTWeb/sys/form/frmDevOpenPage.aspx");//打开起始页面OpenUrl(OpenUrlStr);}catch (Exception ex){ex.printStackTrace();}}});thread.start();}//结束指定名称进程//processName:进程名public static void KillProcess(String processName) {try {String line;Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "tasklist.exe");BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));while ((line = input.readLine()) != null) {if (line.contains(processName)) {String processId = line.split("\\s+")[1];Runtime.getRuntime().exec("taskkill /F /PID " + processId);System.out.println("Process " + processName + " has been killed.");}}input.close();} catch (IOException e) {e.printStackTrace();}}/*** 启动Exe* @param cmdStr 命令串* @param runDir 运行路径*/private static void StartExe(String cmdStr,String runDir){File directory = new File(runDir);try{System.out.println("启动:"+cmdStr);// 创建进程并执行命令Process process = Runtime.getRuntime().exec(cmdStr,null,directory);}catch (Exception ex){System.out.println(ex.getMessage());}}/*** 执行cmd* @param cmdStr 命令串* @param runDir 运行路径*/private static void TryExecCmd(String cmdStr,String runDir){File directory = new File(runDir);try{System.out.println("执行:"+cmdStr);// 创建进程并执行命令Process process = Runtime.getRuntime().exec(cmdStr,null,directory);// 获取命令行程序的输出结果BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}// 等待命令行程序执行完毕int exitCode=process.waitFor();// 关闭资源reader.close();System.out.println("返回:"+exitCode);}catch (Exception ex){System.out.println(ex.getMessage());}}/*** 打印页面** @param url 路径* @throws Exception*/public static void OpenUrl(String url) throws Exception {//获取操作系统类型String os = System.getProperty("os.name").toLowerCase();//根据操作系统类型调用不同的命令if (os.contains("win")) {String path = GetChromePath();if (!path.isEmpty()) {File file = new File(path);if (file.exists()) {//使用Runtime.exec执行命令Runtime.getRuntime().exec(path + " "+ url);return;}}//使用Runtime.exec执行命令Runtime.getRuntime().exec("cmd /c start " + url);} else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) {//Linux or Mac//使用ProcessBuilder创建一个进程ProcessBuilder pb = new ProcessBuilder("google-chrome", url);Process p = pb.start();} else {System.out.println("Unsupported OS");}}/*** 得到谷歌程序地址** @return* @throws Exception*/private static String GetChromePath() throws Exception {String path = GetExeRegedit("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe");if (path.isEmpty()) {path = GetExeRegedit("HKEY_LOCAL_MACHINE\\HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\chrome.exe");}if (!path.isEmpty()) {path += "\\chrome.exe";}return path;}/*** 得到注册表值** @param path 执行路径* @return* @throws Exception*/private static String GetExeRegedit(String path) throws Exception {Process ps = null;//当路径中有空格时,要把路径打上引号。ps = Runtime.getRuntime().exec("reg query \"" + path + "\"");ps.getOutputStream().close();InputStreamReader i = new InputStreamReader(ps.getInputStream());String line;BufferedReader ir = new BufferedReader(i);String ret = "";while ((line = ir.readLine()) != null) {if (line.contains("Path")) {String[] arr = line.split("    ");ret = arr[arr.length - 1];}}return ret;}
}

我以前理解的和spring.net差不多的,配置一堆容器XML,搞多层。因为亲自经历过那种工程的失败,以及后面我推广的简化版Spring.net也因为维护麻烦被架空。实践springboot之后只能说比以前的有过之而无不及,工程和结构起码复杂了几倍的难度,没办法,谁让互联网大、分工详细的呢。传统软件生搬硬套只能说是在找死,哈哈哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/632560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#判断输入的数字是否符合货币格式

目录 一、用正则表达式判断输入是否符合货币格式 二、用double.TryParse()判断输入是否符合货币格式 一、用正则表达式判断输入是否符合货币格式 // 判断输入是否货币合格 using System.Text.RegularExpressions; namespace IsCurrency_Format {partial class Program{stati…

虚幻UE 特效-Niagara特效实战-雨天

回顾Niagara特效基础知识:虚幻UE 特效-Niagara特效初识 其他两篇实战:虚幻UE 特效-Niagara特效实战-火焰、烛火、虚幻UE 特效-Niagara特效实战-烟雾、喷泉 本篇笔记我们再来实战雨天,雨天主要用到了特效中的事件。 文章目录 一、雨天1、创建雨…

九、K8S-label和label Selector

label和label selector 标签和标签选择器 1、label 标签: 一个label就是一个key/value对 label 特性: label可以被附加到各种资源对象上一个资源对象可以定义任意数量的label同一个label可以被添加到任意数量的资源上 2、label selector 标签选择器 L…

k8s的对外服务ingress

1、service的作用体现在两个方面 (1)集群内部:不断跟踪pod的变化,更新deployment中的pod对象,基于pod的ip地址不断变化的一种服务发现机制 (2)集群外部:类似于负载均衡器&#xff…

【计算机组成与体系结构Ⅱ】Tomasulo 算法模拟和分析(实验)

实验5:Tomasulo 算法模拟和分析 一、实验目的 1:加深对指令级并行性及开发的理解。 2:加深对 Tomasulo 算法的理解。 3:掌握 Tomasulo 算法在指令流出、执行、写结果各阶段对浮点操作指令以及 load 和 store 指令进行了什么处…

MATLAB R2023a安装教程

鼠标右击软件压缩包,选择“解压到MATLAB.R2023a”。 打开解压后的文件夹,鼠标右击“R2023a_Windows_iso”选择“装载”。 鼠标右击“setup.exe”选择“以管理员身份运行”。 点击“高级选项”选择“我有文件安装密钥”。 点击“是”,然后点击…

【MCAL】ADC模块详解

目录 前言 正文 1.ADC模块介绍 2.关键概念及依赖的模块 2.1 ADC依赖的模块 3.ADC功能示例 3.1 ADC Buffer Access Mode示例 3.1.1配置(Configuration) 3.1.2 初始化(Initialization) 3.1.3 Adc_GetStreamLastPointer的使…

IP双栈技术

双栈技术产生 在IPv4 Internet向IPv6 Internet过渡的初期,IPv4网络已被大量部署,而IPv6网络只是散布在世界各地的一些孤岛。故而需要一些技术实现IPv6孤岛之间的互联以及IPv4节点和IPv6节点之间的互通。 双栈协议概念 双栈协议是指所有设备必须支持IP…

使用Python的pygame库实现下雪的效果

使用Python的pygame库实现下雪的效果 关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 先给出效果图: 源码如下: import pygame import random# 初始化pygame pygame.init()# 设置屏幕尺寸 width…

【重学C语言】四、常量、变量和基本数据类型转换

【重学C语言】四、常量、变量和基本数据类型转换 1. 常量和变量1.1 常量1.1.1 直接常量1.1.1.1 整数常量1.1.1.2 浮点常量1.1.1.3 字符常量1.1.1.4字符串常量 1.1.2符号常量 1.2 标识符1.3 变量1.3.1 变量的定义1.3.2 左值(Lvalues)和右值(Rv…

一款自动化提权工具

免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。…

1. 安装Git

01. 安装Git 最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。 要使用Git,第一…

PBR材质背光面太暗优化

图形学中漫反射光照遵循兰伯特光照模型,它的公式如下 其中: :漫反射光颜色 :入射光颜色 :材质的漫反射系数 :法线方向 :光源方向 由于背光面的法线方向和光源方向的点积为负数,因此…

1.18寒假集训

A: 解题思路&#xff1a; 这题看似很复杂&#xff0c;其实很简单&#xff0c;找规律不难发现就是输出n 1 下面是c代码&#xff1a; #include<iostream> using namespace std; int main() {int n;cin >> n;cout << n 1;return 0; } B: 解题思路&#xf…

高效解决在本地计算机运行ubuntu服务器端的jupyter lab

文章目录 问题解决方案step1step2step3step4 问题 目前&#xff0c;网上没有什么详细的关于在本地计算机上运行服务器端jupyter lab的教程&#xff0c;由于个人计算机计算资源有限&#xff0c;我们需要利用服务器端的GPU实现高效训练 这篇文章将指导您如何使用 ssh 隧道在远…

【大数据】Flink 测试利器:DataGen

Flink 测试利器&#xff1a;DataGen 1.什么是 FlinkSQL &#xff1f;2.什么是 Connector &#xff1f;3.DataGen Connector3.1 Demo3.2 支持的类型3.3 连接器属性 4.DataGen 使用案例4.1 场景一&#xff1a;生成一亿条数据到 Hive 表4.2 场景二&#xff1a;持续每秒生产 10 万条…

精选100 GPTs深度解析专题

精选100 GPTs深度解析专题 背景 1月10日&#xff0c;GPT应用商店&#xff08;GPT Store&#xff09;的正式上线&#xff0c;GPT技术的应用已经呈现爆炸性增长。目前&#xff0c;市场上已经出现了超过300万种GPTs&#xff0c;应用领域涵盖图像生成、写作、效率提升、研究分析、编…

【论文阅读】Latent Consistency Models (LDMs)、LCM-LoRa

文章目录 IntroductionPreliminariesDiffusion ModelsConsistency Models Latent Consistency ModelsConsistency Distillation in the Latent SpaceOne-Stage Guided Distillation by Solving Augmented PF-ODEAccelerating Distillation with Skipping Time StepsLatent Cons…

企业网盘的价值:为什么企业需要它?

企业网盘因其主打的文件管理协作功能&#xff0c;正好符合信息时代高速发展下企业的需要&#xff0c;能够帮助企业集中管理文件数据&#xff0c;提供便捷的文件协作服务&#xff0c;一跃成为近两年企业服务类产品榜单中的一匹黑马。 企业网盘真的这么好用吗&#xff1f;企业真…

Tessy—嵌入式软件单元测试/集成测试工具

产品概述 Tessy源自戴姆勒—奔驰公司的软件技术实验室&#xff0c;由德国Hitex公司负责销售及技术的支持服务&#xff0c;是一款专门针对嵌入式软件进行单元/集成测试的工具。它可以对C/C代码进行单元、集成测试&#xff0c;可以自动化搭建测试环境、执行测试、评估测试结果并生…