jmeter系列二(jmeter engine相关)
准备知识org.apache.jorphan.collections下的类,engine会使用到
Data类:模拟table存储数据
HashTree类:将对象以树形存储
HashTreeTraverser接口:实现了该接口的类可以获得HashTree中的存储的对象
SearchByClass类:实现了SearchByClass接口,engine会大量用到
第一篇讲的是界面相关的问题,当点击启动按钮jmeter将执行测试开始
这个toolbar是类org.apache.jmeter.gui.util.JMeterMenuBar实现的,看类中的makeRunMenu方法中代码
run_start = makeMenuItemRes("start", 'S', ActionNames.ACTION_START, KeyStrokes.ACTION_START);
1 private static JMenuItem makeMenuItemRes(String resource, int mnemonic, String actionCommand, KeyStroke keyStroke){ 2 JMenuItem menuItem = new JMenuItem(JMeterUtils.getResString(resource), mnemonic); 3 menuItem.setName(resource); 4 menuItem.setActionCommand(actionCommand); 5 menuItem.setAccelerator(keyStroke); 6 menuItem.addActionListener(ActionRouter.getInstance()); 7 return menuItem; 8 }
menu的响应事件的类是ActionRouter,从前面文章可以知道在org.apache.jmeter.gui.action下找到类Start
1 public void doAction(ActionEvent e) { 2 if (e.getActionCommand().equals(ActionNames.ACTION_START)) { 3 popupShouldSave(e); 4 startEngine(false); 5 } else if (e.getActionCommand().equals(ActionNames.ACTION_START_NO_TIMERS)) { 6 popupShouldSave(e); 7 startEngine(true); 8 } else if (e.getActionCommand().equals(ActionNames.ACTION_STOP)) { 9 if (engine != null) { 10 log.info("Stopping test"); 11 GuiPackage.getInstance().getMainFrame().showStoppingMessage(""); 12 engine.stopTest(); 13 } 14 } else if (e.getActionCommand().equals(ActionNames.ACTION_SHUTDOWN)) { 15 if (engine != null) { 16 log.info("Shutting test down"); 17 GuiPackage.getInstance().getMainFrame().showStoppingMessage(""); 18 engine.askThreadsToStop(); 19 } 20 } 21 }
追踪到startEngine方法,其中经过一系列HashTree的相互转换和配置(前提看懂HashTree类的代码),engine开始测试
runTest方法
1 public void runTest() throws JMeterEngineException { 2 if (host != null){ 3 long now=System.currentTimeMillis(); 4 System.out.println("Starting the test on host " + host + " @ "+new Date(now)+" ("+now+")"); 5 } 6 try { 7 Thread runningThread = new Thread(this, "StandardJMeterEngine"); 8 runningThread.start(); 9 } catch (Exception err) { 10 stopTest(); 11 throw new JMeterEngineException(err); 12 } 13 }
最后看到JmeterThread类中run方法,run方法大概流程
1.通过controller获取Sampler
2.执行preprocess(PreProcessor)
3.执行sampler(Sampler)
4.执行postprocess(PostProcessor)
5.调用SampleListeners(Visualizer)
6.调用controller的isDone方法判断是否loop
其中的这些元素都是通过HashTree来存储