jmeter.java

来自「测试工具」· Java 代码 · 共 958 行 · 第 1/3 页

JAVA
958
字号
                }
                // Start the server
				startServer(JMeterUtils.getPropDefault("server_port", 0));// $NON-NLS-1$
				startOptionalServers();
			} else if (parser.getArgumentById(NONGUI_OPT) == null) {
				startGui(parser.getArgumentById(TESTFILE_OPT));
				startOptionalServers();
			} else {
				CLOption rem=parser.getArgumentById(REMOTE_OPT_PARAM);
				if (rem==null) rem=parser.getArgumentById(REMOTE_OPT);
				startNonGui(parser.getArgumentById(TESTFILE_OPT), 
						parser.getArgumentById(LOGFILE_OPT), 
						rem);
				startOptionalServers();
			}
		} catch (IllegalUserActionException e) {
			System.out.println(e.getMessage());
			System.out.println("Incorrect Usage");
			System.out.println(CLUtil.describeOptions(options).toString());
		} catch (Throwable e) {
            if (log != null){
                log.fatalError("An error occurred: ",e);
            } else {
            	e.printStackTrace();
            }
			System.out.println("An error occurred: " + e.getMessage());
			System.exit(1);
		}
	}

    // Update classloader if necessary
	private void updateClassLoader() {
            updatePath("search_paths",";"); //$NON-NLS-1$//$NON-NLS-2$
            updatePath("user.classpath",File.pathSeparator);//$NON-NLS-1$
    }

	private void updatePath(String property, String sep) {
        String userpath= JMeterUtils.getPropDefault(property,"");// $NON-NLS-1$
        if (userpath.length() <= 0) return;
        log.info(property+"="+userpath); //$NON-NLS-1$
		StringTokenizer tok = new StringTokenizer(userpath, sep);
		while(tok.hasMoreTokens()) {
		    String path=tok.nextToken();
		    File f=new File(path);
		    if (!f.canRead() && !f.isDirectory()) {
		        log.warn("Can't read "+path);   
		    } else {
	            log.info("Adding to classpath: "+path);
	            try {
					NewDriver.addPath(path);
				} catch (MalformedURLException e) {
					log.warn("Error adding: "+path+" "+e.getLocalizedMessage());
				}
		    }
		}
	}

    /**
	 * 
	 */
	private void startOptionalServers() {
		int bshport = JMeterUtils.getPropDefault("beanshell.server.port", 0);// $NON-NLS-1$
		String bshfile = JMeterUtils.getPropDefault("beanshell.server.file", "");// $NON-NLS-1$ $NON-NLS-2$
		if (bshport > 0) {
			log.info("Starting Beanshell server (" + bshport + "," + bshfile + ")");
			Runnable t = new BeanShellServer(bshport, bshfile);
			t.run();
		}
        
        // Should we run a beanshell script on startup?
        String bshinit = JMeterUtils.getProperty("beanshell.init.file");// $NON-NLS-1$
        if (bshinit != null){
            log.info("Run Beanshell on file: "+bshinit);
            try {
                BeanShellInterpreter bsi = new BeanShellInterpreter();//bshinit,log);
                bsi.source(bshinit);
            } catch (ClassNotFoundException e) {
                log.warn("Could not start Beanshell: "+e.getLocalizedMessage());
            } catch (JMeterException e) {
                log.warn("Could not process Beanshell file: "+e.getLocalizedMessage());
            }
        }
        
        int mirrorPort=JMeterUtils.getPropDefault("mirror.server.port", 0);// $NON-NLS-1$
        if (mirrorPort > 0){
			log.info("Starting Mirror server (" + mirrorPort + ")");
			try {
				Object instance = ClassTools.construct(
						"org.apache.jmeter.protocol.http.control.HttpMirrorControl",// $NON-NLS-1$
						mirrorPort);
	            ClassTools.invoke(instance,"startHttpMirror");
			} catch (JMeterException e) {
				log.warn("Could not start Mirror server",e);
			}
        }
	}

	/**
	 * Sets a proxy server for the JVM if the command line arguments are
	 * specified.
	 */
	private void setProxy(CLArgsParser parser) throws IllegalUserActionException {
		if (parser.getArgumentById(PROXY_USERNAME) != null) {
            Properties jmeterProps = JMeterUtils.getJMeterProperties();
			if (parser.getArgumentById(PROXY_PASSWORD) != null) {
				String u, p;
				Authenticator.setDefault(new ProxyAuthenticator(u = parser.getArgumentById(PROXY_USERNAME)
						.getArgument(), p = parser.getArgumentById(PROXY_PASSWORD).getArgument()));
				log.info("Set Proxy login: " + u + "/" + p);
                jmeterProps.setProperty(HTTP_PROXY_USER, u);//for Httpclient
                jmeterProps.setProperty(HTTP_PROXY_PASS, p);//for Httpclient
			} else {
				String u;
				Authenticator.setDefault(new ProxyAuthenticator(u = parser.getArgumentById(PROXY_USERNAME)
						.getArgument(), ""));
				log.info("Set Proxy login: " + u);
                jmeterProps.setProperty(HTTP_PROXY_USER, u);
			}
		}
		if (parser.getArgumentById(PROXY_HOST) != null && parser.getArgumentById(PROXY_PORT) != null) {
			String h = parser.getArgumentById(PROXY_HOST).getArgument();
            String p = parser.getArgumentById(PROXY_PORT).getArgument();
			System.setProperty("http.proxyHost",  h );// $NON-NLS-1$
			System.setProperty("https.proxyHost", h);// $NON-NLS-1$
			System.setProperty("http.proxyPort",  p);// $NON-NLS-1$
			System.setProperty("https.proxyPort", p);// $NON-NLS-1$
			log.info("Set http[s].proxyHost: " + h + " Port: " + p);
		} else if (parser.getArgumentById(PROXY_HOST) != null || parser.getArgumentById(PROXY_PORT) != null) {
			throw new IllegalUserActionException(JMeterUtils.getResString("proxy_cl_error"));// $NON-NLS-1$
		}
        
        if (parser.getArgumentById(NONPROXY_HOSTS) != null) {
            String n = parser.getArgumentById(NONPROXY_HOSTS).getArgument();
            System.setProperty("http.nonProxyHosts",  n );// $NON-NLS-1$
            System.setProperty("https.nonProxyHosts", n );// $NON-NLS-1$
            log.info("Set http[s].nonProxyHosts: "+n);
        }
	}

	private void initializeProperties(CLArgsParser parser) {
		if (parser.getArgumentById(PROPFILE_OPT) != null) {
			JMeterUtils.loadJMeterProperties(parser.getArgumentById(PROPFILE_OPT).getArgument());
		} else {
			JMeterUtils.loadJMeterProperties(NewDriver.getJMeterDir() + File.separator
                    + "bin" + File.separator // $NON-NLS-1$
					+ "jmeter.properties");// $NON-NLS-1$
		}

		if (parser.getArgumentById(JMLOGFILE_OPT) != null){
			String jmlogfile=parser.getArgumentById(JMLOGFILE_OPT).getArgument();
			JMeterUtils.setProperty(LoggingManager.LOG_FILE,jmlogfile);
		}
		
		JMeterUtils.initLogging();
		JMeterUtils.initLocale();
		// Bug 33845 - allow direct override of Home dir
		if (parser.getArgumentById(JMETER_HOME_OPT) == null) {
			JMeterUtils.setJMeterHome(NewDriver.getJMeterDir());
		} else {
			JMeterUtils.setJMeterHome(parser.getArgumentById(JMETER_HOME_OPT).getArgument());
		}

		Properties jmeterProps = JMeterUtils.getJMeterProperties();
		remoteProps = new Properties();

		// Add local JMeter properties, if the file is found
		String userProp = JMeterUtils.getPropDefault("user.properties",""); //$NON-NLS-1$
		if (userProp.length() > 0){ //$NON-NLS-1$
			FileInputStream fis=null;
			try {
                File file = JMeterUtils.findFile(userProp);
                if (file.canRead()){
                	log.info("Loading user properties from: "+file.getCanonicalPath());
					fis = new FileInputStream(file);
					Properties tmp = new Properties();
					tmp.load(fis);
					jmeterProps.putAll(tmp);
					LoggingManager.setLoggingLevels(tmp);//Do what would be done earlier
                }
			} catch (IOException e) {
				log.warn("Error loading user property file: " + userProp, e);
            } finally {
            	JOrphanUtils.closeQuietly(fis);
			}			
		}

		// Add local system properties, if the file is found
		String sysProp = JMeterUtils.getPropDefault("system.properties",""); //$NON-NLS-1$
		if (sysProp.length() > 0){
			FileInputStream fis=null;
			try {
                File file = JMeterUtils.findFile(sysProp);
                if (file.canRead()){
                	log.info("Loading system properties from: "+file.getCanonicalPath());
					fis = new FileInputStream(file);
					System.getProperties().load(fis);
                }
			} catch (IOException e) {
				log.warn("Error loading system property file: " + sysProp, e);
            } finally {
            	JOrphanUtils.closeQuietly(fis);
			}			
		}

		// Process command line property definitions
		// These can potentially occur multiple times
		
		List clOptions = parser.getArguments();
		int size = clOptions.size();

		for (int i = 0; i < size; i++) {
			CLOption option = (CLOption) clOptions.get(i);
			String name = option.getArgument(0);
			String value = option.getArgument(1);
            FileInputStream fis = null;            

			switch (option.getDescriptor().getId()) {
			
			// Should not have any text arguments
            case CLOption.TEXT_ARGUMENT:
                throw new IllegalArgumentException("Unknown arg: "+option.getArgument());
			
            case PROPFILE2_OPT: // Bug 33920 - allow multiple props
				try {
                    fis = new FileInputStream(new File(name));
					Properties tmp = new Properties();
					tmp.load(fis);
					jmeterProps.putAll(tmp);
					LoggingManager.setLoggingLevels(tmp);//Do what would be done earlier
				} catch (FileNotFoundException e) {
					log.warn("Can't find additional property file: " + name, e);
				} catch (IOException e) {
					log.warn("Error loading additional property file: " + name, e);
                } finally {
                	JOrphanUtils.closeQuietly(fis);
				}
				break;
            case SYSTEM_PROPFILE:
                log.info("Setting System properties from file: " + name);
                try {
                    fis = new FileInputStream(new File(name));
                    System.getProperties().load(fis);
                } catch (IOException e) {
                    log.warn("Cannot find system property file "+e.getLocalizedMessage());
                } finally {
                	JOrphanUtils.closeQuietly(fis);
                }
                break;
			case SYSTEM_PROPERTY:
				if (value.length() > 0) { // Set it
					log.info("Setting System property: " + name + "=" + value);
					System.getProperties().setProperty(name, value);
				} else { // Reset it
					log.warn("Removing System property: " + name);
					System.getProperties().remove(name);
				}
				break;
			case JMETER_PROPERTY:
				if (value.length() > 0) { // Set it
					log.info("Setting JMeter property: " + name + "=" + value);
					jmeterProps.setProperty(name, value);
				} else { // Reset it
					log.warn("Removing JMeter property: " + name);
					jmeterProps.remove(name);
				}
				break;
			case JMETER_GLOBAL_PROP:
				if (value.length() > 0) { // Set it
					log.info("Setting Global property: " + name + "=" + value);
					remoteProps.setProperty(name, value);
				}
				break;
			case LOGLEVEL:
				if (value.length() > 0) { // Set category
					log.info("LogLevel: " + name + "=" + value);
					LoggingManager.setPriority(value, name);
				} else { // Set root level
					log.warn("LogLevel: " + name);
					LoggingManager.setPriority(name);
				}
				break;
			case REMOTE_STOP:
				remoteStop = true;
				break;
			}
		}
	
	}

	private void startServer(int port) {
		try {
			new RemoteJMeterEngineImpl(port);
		} catch (Exception ex) {
			log.error("Giving up, as server failed with:", ex);
			System.err.println("Server failed to start: "+ex);
			System.exit(1);// Give up
		}
	}

	private void startNonGui(CLOption testFile, CLOption logFile, CLOption remoteStart)
			throws IllegalUserActionException {
		// add a system property so samplers can check to see if JMeter
		// is running in NonGui mode
		System.setProperty("JMeter.NonGui", "true");// $NON-NLS-1$
		// Force the X11 display to be checked
		try {
		    new JLabel();
		} catch (InternalError e){
			// ignored
		}
		JMeter driver = new JMeter();// TODO - why does it create a new instance?
		driver.remoteProps = this.remoteProps;
		driver.remoteStop = this.remoteStop;
		driver.parent = this;
		PluginManager.install(this, false);

		String remote_hosts_string = null;
		if (remoteStart != null) {
			remote_hosts_string = remoteStart.getArgument();
			if (remote_hosts_string == null) {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?