当前位置: 代码迷 >> 高性能WEB开发 >> webservice并发有关问题
  详细解决方案

webservice并发有关问题

热度:694   发布时间:2013-12-04 17:21:01.0
webservice并发问题,求助
WS服务发布在AIX上,在LR中性能测试过程中会出现几笔业务连接不上服务,异常如下:其中服务端CPU  idle差不多还有20-30左右,同时有些业务响应时间达到20秒左右,服务端处理的业务逻辑比较简单。请问谁知道什么原因吗?万分感谢
javax.xml.ws.WebServiceException: Failed to access the WSDL at: http://172.16.9.18:8991/service/SOAPServer?wsdl. It failed with: 
远程主机在超时周期内没有响应。.
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:163)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:145)
at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:247)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:210)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:158)
at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:93)
at javax.xml.ws.Service.<init>(Service.java:67)
Caused by: 
java.net.ConnectException: 远程主机在超时周期内没有响应。
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:412)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:271)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:258)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:376)
at java.net.Socket.connect(Socket.java:546)
at java.net.Socket.connect(Socket.java:495)
webservice、LR

------解决方案--------------------
信息量太少,只能给出点大概建议:
1、检查线程池配置,是不是太少了;
2、输出线程堆栈,看是否大量线程集中在某些等待位置;
3、用JProfiler之类的分析工具,实时监控和分析每个类执行的时间开销,找出瓶颈点。
------解决方案--------------------
引用:
谢谢回答,WS服务不是一个请求就开启一个独立的线程吗   你说的线程池配置是在要到哪配置


是也不是。。。

创建线程需要时间的,所以中间件为了能更好的服务并发请求,会准备一个线程池,比如先圈养50个空闲线程发呆,那么如果来了50个请求,瞬间就可以完成了,而不用浪费不断创建线程的时间。如果超过50个请求同时来,则线程池可以根据配置不断增加工作线程进去。

当然,物极必反,如果来1W个请求,不能创建1W个线程吧?所以要给线程池配置最大容量。


具体去Google吧,打字也很慢的说。。。
------解决方案--------------------
引用:
我是用jdk6发布服务的,WS服务不是一个请求就开启一个独立的线程吗,你说的线程池配置是在要到哪配置


对于直接发布服务的不熟悉,刚才查了下,大致说法是:

直接使用Endpoint.publish()方法发布的Web服务同一时刻只能处理一个请求(单线程)。

如果想要使用多线程机制发布服务,可使用Endpoint实例中的
    void setExecutor(Executor executor)
方法设置一个线程池对象。
  相关解决方案