我试图直接从Java代码运行JMeter测试。负载应该通过JMeter服务器产生。在代码中,我使用连接到服务器上运行的JMeter守护进程的ClientJMeterEngine实例。这工作到目前为止,我可以开始并运行我的测试。我目前不了解的是如何在测试结果完成后从测试结果中获得结果。我当前的代码如下所示:从Java中的JMeter远程测试中获得结果
// create ClientJMeterEngine instance
ClientJMeterEngine jmeter = new ClientJMeterEngine("myHost:4000");
// load test
File file = new File("C:/myTest.jmx");
// configure test
HashTree testPlanTree = SaveService.loadTree(file);
jmeter.configure(testPlanTree);
// run test
jmeter.runTest();
如果我运行使用StandardJMeterEngine对象的测试中,我使用ResultCollector摆脱我的测试运行的结果。这按预期工作。当我尝试使用所描述的基于服务器的方法来运行测试,我拿到机器上以下异常的服务器运行的位置:
2016/03/15 09:24:35 ERROR - jmeter.samplers.BatchSampleSender: testEnded(host) java.rmi.ConnectException: Connection refused to host: myHost; nested exception is:
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:631)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:228)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:214)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:238)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:190)
at com.sun.proxy.$Proxy1.processBatch(Unknown Source)
服务器因此希望回叫,从我开始,客户端测试运行。它失败了,因为我没有任何东西在等待远程通话。我已经通过JMeter源代码工作,但没有找到答案,我需要在Java端做什么来完成这项工作。
编辑 与此同时,我取得了一些进展。我发现的是:
客户端线程必须保持状态运行,所以客户端上的ResultCollector可以从服务器接收结果。我现在通过在客户端Java代码中“忙等待”来做到这一点。 现在的问题是要知道服务器上的测试执行何时完成,因此我也可以完成客户端线程。 ResultCollector确实有能力识别测试已完成,但没有公开的方法。 解决方案将扩展ResultCollector并覆盖testEnded方法:此方法将公共布尔变量“testFinished”设置为true。
虽然这感觉有点“哈克”。有人在这里有更好的解决方案吗?
好吧在某个远程存根上调用它从某处获得的东西。我不知道JMeter远程处理,但你显然确实导出了一个远程对象并提供了它的存根,并且随后未导出它。或者JMeter做到了。 – EJP