从Java

时间:2016-03-15 14:43:05

标签: java callback jmeter rmi

我试图直接从我的Java代码运行JMeter测试。应通过JMeter服务器生成负载。在代码中,我使用ClientJMeterEngine实例连接到服务器上运行的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端做些什么才能完成这项工作。

EDIT 与此同时,我取得了一些进展。我发现的是以下内容:

客户端线程必须保持状态运行,因此客户端上的ResultCollector可以从服务器接收结果。我现在通过我的客户端Java代码中的“忙等待”来完成此操作。 现在的问题是知道服务器上的测试执行何时完成,所以我也可以完成客户端线程。 ResultCollector确实具有识别测试已完成的功能,但没有公开的方法。 解决方案是扩展ResultCollector并覆盖testEnded方法:此方法将公共布尔变量“testFinished”设置为true。

虽然这感觉有点“hacky”。有人在这里有更好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题并尝试使用覆盖ResultCollector类的testEnded()方法来解决问题。我的测试无休止地等待远程JMeter从服务器的响应。

实际问题是远程服务器 - Slave - 在早期成功回复Master的请求。但是,连接在某些时候丢失,测试结束时没有收到Slave的任何报告。 Slave无法启动新的TCP连接,并且在准备好测试报告时无法发送结果,因为其主机名(IP)尚未正确设置/发送给Master。

因此,解决方案是在命令行或jmeter.properties中使用正确的参数启动Slave。

我这样开始了我的奴隶:

c:\ JMeter_new \ apache-jmeter-3.1 \ bin> jmeter-server -Djava.rmi.server.hostname = IP

其中IP是奴隶

PS如果在GUI中运行测试,也可以使用参数运行Master:

D:\ JMeter_new \ apache-jmeter-3.1 \ bin> jmeterw -Djava.rmi.server.hostname = IP_of_master