Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取Java中JMeter远程测试的结果_Java_Callback_Jmeter_Rmi - Fatal编程技术网

获取Java中JMeter远程测试的结果

获取Java中JMeter远程测试的结果,java,callback,jmeter,rmi,Java,Callback,Jmeter,Rmi,我试图直接从Java代码运行JMeter测试。应该通过JMeter服务器生成负载。在代码中,我使用了一个ClientJMeterEngine实例,该实例连接到服务器上运行的JMeter守护进程。到目前为止,我可以启动并运行我的测试。我目前不明白的是,在测试完成后如何从测试运行中获得结果。我当前的代码如下所示: // create ClientJMeterEngine instance ClientJMeterEngine jmeter = new ClientJMeterEngine("myHo

我试图直接从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方面做些什么才能使它工作

编辑 与此同时,我取得了一些进展。我的发现如下:

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


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

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

实际问题是远程服务器-从服务器-在早期阶段成功地响应了来自主服务器的请求。但是,连接在某个点断开,测试在没有从从属服务器收到任何报告的情况下完成。从属服务器无法启动新的TCP连接,并且在准备好测试报告时无法发送结果,因为其主机名(IP)未正确设置/发送给主服务器

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

我是这样开始我的奴隶的:

// 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();
c:\JMeter\u new\apache-JMeter-3.1\bin>JMeter服务器-Djava.rmi.server.hostname=IP

其中IP是从机的IP地址

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


D:\JMeter\u new\apache-JMeter-3.1\bin>jmeterw-Djava.rmi.server.hostname=IP\u of_master

它在某个远程存根上调用它从某个地方得到的东西。我不知道JMeter远程处理,但您显然导出了一个远程对象,并提供了它的存根,然后取消了它的导出。或者杰米特做到了。