Jmeter源码学习系列:从Jmeter.properties加载配置并启动Jmeter
2018-01-04 12:02
495 查看
Jmeter源码学习系列:从Jmeter.properties加载配置并启动Jmeter
上一篇简单说了一下jmeter/src/core/org.apache.jmeter/NewDriver.Java文件,简单描述了一下在启动Jmeter前做的准备工作,这次我们从NewDriver.java的main方法入手,看看Jmeter启动的时候是怎么从Jmeter.properties文件加载配置的。
public static void main(String[] args) {先检测基本的环境变量配置:如Java环境,Jmeter的安装路径,如果环境变量配置有错,直接报错
对静态变量进行定义
运行Jmeter.start方法,启动Jmeter
上一篇简单说了一下jmeter/src/core/org.apache.jmeter/NewDriver.Java文件,简单描述了一下在启动Jmeter前做的准备工作,这次我们从NewDriver.java的main方法入手,看看Jmeter启动的时候是怎么从Jmeter.properties文件加载配置的。
public static void main(String[] args) {先检测基本的环境变量配置:如Java环境,Jmeter的安装路径,如果环境变量配置有错,直接报错
if(!EXCEPTIONS_IN_INIT.isEmpty()) { System.err.println("Configurationerror during init, see exceptions:"+exceptionsToString(EXCEPTIONS_IN_INIT)); } else{ Thread.currentThread().setContextClassLoader(loader);对Jmeter使用的Log进行初始化
setLoggingProperties(args);加载Jmeter方法
Class<?> initialClass =loader.loadClass("org.apache.jmeter.JMeter");// $NON-NLS-1$从这里进入jmeter/src/core/org.apache.jmeter/Jmeter.Java
对静态变量进行定义
Object instance = initialClass.newInstance(); Method startup = initialClass.getMethod("start", new Class[]{ new String[0].getClass() });//$NON-NLS- startup.invoke(instance, new Object[]{ args });
} catch(Throwable e){ // NOSONAR We want to log home directory in case of exception e.printStackTrace(); // NOSONAR No logger at this step System.err.println("JMeter home directory was detected as: "+JMETER_INSTALLATION_DIRECTORY); } } }
运行Jmeter.start方法,启动Jmeter
/** * Takes the command line arguments anduses them to determine how to * startup JMeter. * * Called reflectively by {@link NewDriver#main(String[])} * @param argsThe arguments for JMeter */ public void start(String[] args) {检测启动模式,GUI或者NonGUI
CLArgsParserparser = new CLArgsParser(args, options); String error =parser.getErrorString(); if (error == null){// Check optioncombinations booleangui = parser.getArgumentById(NONGUI_OPT)==null; boolean nonGuiOnly =parser.getArgumentById(REMOTE_OPT)!=null ||parser.getArgumentById(REMOTE_OPT_PARAM)!=null ||parser.getArgumentById(REMOTE_STOP)!=null; if (gui &&nonGuiOnly) { error = "-r and -R and -X are only valid in non-GUI mode"; } } if (null != error) { System.err.println("Error: "+ error);//NOSONAR System.out.println("Usage");//NOSONAR System.out.println(CLUtil.describeOptions(options).toString());//NOSONAR // repeat the error so no need toscroll back past the usage to see it System.out.println("Error:" + error);//NOSONAR return; } try {初始化Jmeter的log
initializeProperties(parser); // Also initialisesJMeter logging Thread.setDefaultUncaughtExceptionHandler( (Thread t, Throwable e) -> { if(!(e instanceof ThreadDeath)) { log.error("Uncaughtexception: ", e); System.err.println("UncaughtException " + e + ". See log filefor details.");//NOSONAR } }); if (log.isInfoEnabled()) { log.info(JMeterUtils.getJMeterCopyright()); log.info("Version{}", JMeterUtils.getJMeterVersion()); log.info("java.version={}", System.getProperty("java.version"));//$NON-NLS-1$ //$NON-NLS-2$ log.info("java.vm.name={}", System.getProperty("java.vm.name"));//$NON-NLS-1$ //$NON-NLS-2$ log.info("os.name={}", System.getProperty("os.name"));//$NON-NLS-1$ //$NON-NLS-2$ log.info("os.arch={}",System.getProperty("os.arch"));//$NON-NLS-1$//$NON-NLS-2$ log.info("os.version={}", System.getProperty("os.version"));//$NON-NLS-1$ //$NON-NLS-2$ log.info("file.encoding={}", System.getProperty("file.encoding"));//$NON-NLS-1$ //$NON-NLS-2$ log.info("Maxmemory ={}", Runtime.getRuntime().maxMemory()); log.info("AvailableProcessors ={}", Runtime.getRuntime().availableProcessors()); log.info("DefaultLocale={}", Locale.getDefault().getDisplayName()); log.info("JMeter Locale={}", JMeterUtils.getLocale().getDisplayName()); log.info("JMeterHome={}", JMeterUtils.getJMeterHome()); log.info("user.dir ={}",System.getProperty("user.dir"));//$NON-NLS-1$//$NON-NLS-2$ log.info("PWD ={}",new File(".").getCanonicalPath());//$NON-NLS-1$ log.info("IP:{} Name: {} FullName: {}", JMeterUtils.getLocalHostIP(), JMeterUtils.getLocalHostName(), JMeterUtils.getLocalHostFullName()); } setProxy(parser); updateClassLoader(); if (log.isDebugEnabled()) { String jcp=System.getProperty("java.class.path");// $NON-NLS-1$ String[] bits = jcp.split(File.pathSeparator); log.debug("ClassPath"); for(String bit :bits){ log.debug(bit); } }初始化一些有用的信息,比如当前时间,运行时间等等
// Setsome (hopefully!) useful properties longnow=System.currentTimeMillis(); JMeterUtils.setProperty("START.MS",Long.toString(now));// $NON-NLS-1$ Date today=new Date(now); // so it agrees with above JMeterUtils.setProperty("START.YMD",newSimpleDateFormat("yyyyMMdd").format(today));// $NON-NLS-1$$NON-NLS-2$ JMeterUtils.setProperty("START.HMS",newSimpleDateFormat("HHmmss").format(today));// $NON-NLS-1$$NON-NLS-2$ if(parser.getArgumentById(VERSION_OPT)!= null) { displayAsciiArt(); } elseif (parser.getArgumentById(HELP_OPT)!= null) { displayAsciiArt(); System.out.println(JMeterUtils.getResourceFileAsText("org/apache/jmeter/help.txt"));//NOSONAR $NON-NLS-1$ } elseif (parser.getArgumentById(OPTIONS_OPT)!= null) { displayAsciiArt(); System.out.println(CLUtil.describeOptions(options).toString());//NOSONAR } elseif (parser.getArgumentById(SERVER_OPT)!= null) { //Start the server try { RemoteJMeterEngineImpl.startServer(JMeterUtils.getPropDefault("server_port",0)); // $NON-NLS-1$ startOptionalServers(); } catch (Exception ex) { System.err.println("Serverfailed to start: "+ex);//NOSONAR log.error("Givingup, as server failed with:", ex); throw ex; } } else{ String testFile=null; CLOption testFileOpt =parser.getArgumentById(TESTFILE_OPT); if (testFileOpt != null){ testFile = testFileOpt.getArgument(); if (USE_LAST_JMX.equals(testFile)) { testFile =LoadRecentProject.getRecentFile(0);// most recent } } CLOption testReportOpt =parser.getArgumentById(REPORT_GENERATING_OPT); if (testReportOpt != null) { // generatereport from existing file String reportFile= testReportOpt.getArgument(); extractAndSetReportOutputFolder(parser); ReportGenerator generator= new ReportGenerator(reportFile, null); generator.generate(); } else if (parser.getArgumentById(NONGUI_OPT) == null){ // not non-GUI => GUI如果设置为GUI模式启动,直接启动GUI
startGui(testFile); startOptionalServers();剩下的就不贴了
相关文章推荐
- Jmeter源码学习系列:启动Jmeter
- saltstack源码-启动3-config.py配置文件加载
- Spring学习总结(20)——Spring加载多个项目properties配置文件问题解决
- Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】
- Spring Cloud学习系列_3参数引入、多环境配置、加载顺序
- springboot 修改启动时默认加载application.properties文件以及加载指定配置文件
- Jmeter源码学习系列:用GUI的基本操作
- Spring学习总结(20)——Spring加载多个项目properties配置文件问题解决
- Openstack学习笔记之——Neutron-server服务加载与启动源码分析(三)
- redis源码学习3 启动、配置及socket
- Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】
- 【Spring源码分析系列】启动component-scan类扫描加载过程
- <util:properties/>加载的配置文件中有中文导致乱码,如何通过分析源码解决问题?
- Duilib 学习源码系列1-加载XML
- 【Spring】Spring的IOC(控制反转)/DI(依赖注入)原理(三):Spring启动加载配置文件源码分析
- SpringBoot学习系列 | 获取properties配置
- Cobar源码笔记--从加载配置文件到服务器启动
- Dubbo源码学习系列-配置
- 通过DefaultListableBeanFactory加载.xml配置文件学习Spring-IoC容器注册/加载bean的机制(源码走读)
- MyCat源码分析系列之——配置信息和启动流程