2015-03-19 169 views
2

我正在開發ajax儀表板的JMeter腳本。用戶登錄,導航到存儲庫,單擊儀表板鏈接,等待儀表板顯示,然後註銷。JMeter java.net.SocketException:套接字關閉

儀表板有五個dashlets。我在腳本中已經談到了五個採樣器對,每個採樣器對應一個採樣器。每一對中的第一個採樣器都有一個POST REST請求,並在主體中帶有ajax。有一個正則表達式提取器從響應的主體中提取一個id。這個ID被添加到該對的第二個採樣器中的URL,該對中的body還包含POST REST請求和ajax。

當這些採樣器有一對或兩對時,腳本100%的時間工作,執行採樣器返回HTTP 200響應,並正確替換每對中第一個採樣器提取的id,然後退出採樣器(exit.html)。當添加第三對採樣器時,我每10-15次執行一次就會得到SocketException。隨着四對啓用它發生得更頻繁,並與第五對啓用它發生100%的時間。

奇怪的是SocketException發生在註銷採樣器中,沒有其他採樣器。另外,如果註銷採樣器被禁用,套接字例外從不發生,它可以在100%的時間內工作。

下面是完整的堆棧跟蹤:

java.net.SocketException: Socket closed 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1676) 
at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1674) 
at java.security.AccessController.doPrivileged(Native Method) 
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1672) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1245) 
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468) 
at org.apache.jmeter.protocol.http.sampler.HTTPJavaImpl.readResponse(HTTPJavaImpl.java:258) 
at org.apache.jmeter.protocol.http.sampler.HTTPJavaImpl.sample(HTTPJavaImpl.java:514) 
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74) 
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.followRedirects(HTTPSamplerBase.java:1486) 
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.resultProcessing(HTTPSamplerBase.java:1561) 
at org.apache.jmeter.protocol.http.sampler.HTTPAbstractImpl.resultProcessing(HTTPAbstractImpl.java:338) 
at org.apache.jmeter.protocol.http.sampler.HTTPJavaImpl.sample(HTTPJavaImpl.java:588) 
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74) 
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1141) 
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1130) 
at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:431) 
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:258) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: java.net.SocketException: Socket closed 
at java.net.SocketInputStream.socketRead0(Native Method) 
at java.net.SocketInputStream.read(SocketInputStream.java:152) 
at java.net.SocketInputStream.read(SocketInputStream.java:122) 
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) 
at java.io.BufferedInputStream.read1(BufferedInputStream.java:275) 
at java.io.BufferedInputStream.read(BufferedInputStream.java:334) 
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:689) 
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1324) 
at sun.net.www.protocol.http.HttpURLConnection.getHeaderField(HttpURLConnection.java:2691) 
at java.net.URLConnection.getHeaderFieldLong(URLConnection.java:639) 
at java.net.URLConnection.getContentLengthLong(URLConnection.java:511) 
at java.net.URLConnection.getContentLength(URLConnection.java:495) 
at org.apache.jmeter.protocol.http.sampler.HTTPJavaImpl.readResponse(HTTPJavaImpl.java:224) 
... 12 more 

我希望得到任何幫助調試此

回答

1

我相信你由於修改HTTP越來越套接字關​​閉錯誤請求的默認設置的改變,包括

  • 禁用失敗請求
  • 禁用失效檢查

請參閱Connection Reset since JMeter 2.10 ?維基頁面以獲取有關如何繞過它的更詳細說明和選項,如果您確定問題不在您的Web服務器上。

另外,發送單個HTTP請求並不是非常正確的測試AJAX應用程序的方法,因爲AJAX假定在同一父線程的範圍內踢出額外請求。當前JMeter實現不允許覆蓋父線程組限制,因此它使用一個線程一次不可能產生多個請求。

檢出How to Load Test AJAX/XHR Enabled Sites With JMeter關於如何正確測試AJAX應用程序的選項指南。

+1

感謝您的回覆。問題不在於鏈接中的連接重置問題。我使用Wireshark來檢查流量,發現在一個樣本的一個樣本正在關閉另一個樣本所需的另一個樣本的連接之間發生碰撞,從而導致Socket關閉異常。我通過將每個Dashlet分別記錄到單個事務控制器中來解決它,所以現在沒有衝突。 – 2015-03-23 23:01:21

+1

所以現在,我有五個事務控制器同步執行,它們在瀏覽器中異步運行。在你提到的文章中,他們說使用JSR223採樣器來運行ajax請求,但是我所看到的例子甚至沒有使用ajax。您可以充實一下JSR223採樣器如何解決這個問題嗎? – 2015-03-23 23:19:22