您的位置:首页 > 运维架构

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的安装路径,如果环境变量配置有错,直接报错

    
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();
剩下的就不贴了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐