2015-03-19 201 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

相关问题