我試圖直接從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