webservice客户端设置连接超时时间失效

言惜 2017-08-26 12:34:18
(java语言)使用webservice开发客户端,并设置了超时时间为5秒,代码如下:
Map<String, Object> ctxt = ((BindingProvider) apps).getRequestContext();
ctxt.put("com.sun.xml.internal.ws.connect.timeout", 5*1000);
ctxt.put("com.sun.xml.internal.ws.request.timeout", 5*1000);

首先将服务端关闭,然后运行客户端向服务端发起请求,按照我的理解,客户端应该会在第5s时报连接超时错误,然而客户端却是在20s的时候才报连接超时错误,感觉上面的连接超时时间设置失效了,求大神答疑解惑啊,是我对连接超时时间理解错了吗
20秒时报的异常如下:
javax.xml.ws.WebServiceException: Failed to access the WSDL at: http://192.168.49.110:8080/TestGeneAxisServer/services/appsystemstatusHttpPort?wsdl. It failed with:
Got Connection timed out: connect while opening stream from http://192.168.49.110:8080/TestGeneAxisServer/services/appsystemstatusHttpPort?wsdl.
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(Unknown Source)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(Unknown Source)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(Unknown Source)
at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(Unknown Source)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(Unknown Source)
at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(Unknown Source)
at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(Unknown Source)
at javax.xml.ws.Service.<init>(Unknown Source)
at com.xaec.Appsystemstatus.<init>(Appsystemstatus.java:50)
at koal.kmail.assistant.tool.sendSysStaus.SystemStatusUtil.sendSystemStatusToPortal(SystemStatusUtil.java:34)
at koal.kmail.assistant.tool.sendSysStaus.SystemStatusUtil.main(SystemStatusUtil.java:26)
Caused by: java.io.IOException: Got Connection timed out: connect while opening stream from http://192.168.49.110:8080/TestGeneAxisServer/services/appsystemstatusHttpPort?wsdl
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.createReader(Unknown Source)
at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.resolveWSDL(Unknown Source)
... 10 more
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.<init>(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.http.HttpClient.New(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.URL.openStream(Unknown Source)
... 12 more

另外:webservice客户端中间代码室友jdk自带的命令生成的
...全文
1222 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
我也遇见这个问题,请问你后面怎么解决的?
王_de 2020-08-18
  • 打赏
  • 举报
回复
请问楼主,针对获取wsdl时候超时,后面是怎么处理的?
tianfang 2017-09-08
  • 打赏
  • 举报
回复
引用 4 楼 cai642343061 的回复:
你说的好像有道理 不过,如果直接调用new HelloServiceImplService();就不能传入webservice服务端的url了,当服务端的url改变了,我们的程序也得改了,不能通过配置的方式动态适应
getHelloServiceImplPort还有一个带参数的getHelloServiceImplPort(URL); 用这个就可以修改
言惜 2017-09-07
  • 打赏
  • 举报
回复
引用 3 楼 tianfang 的回复:
你设置超时的代码没错,现在获取wsdl时候超时 你生成的客户端,其中应该有Service和ServiceImpl ,直接按demo给的方法而不是你现在的每次调用都根据wsdl动态生成

       //创建服务访问点集合对象
        HelloServiceImplService helloServiceImplService=new HelloServiceImplService();
        //获得服务点绑定的类
        HelloServiceImpl helloService=helloServiceImplService.getHelloServiceImplPort();
        //调用服务端方法
        String returnstr=helloService.say("小明");
你说的好像有道理 不过,如果直接调用new HelloServiceImplService();就不能传入webservice服务端的url了,当服务端的url改变了,我们的程序也得改了,不能通过配置的方式动态适应
tianfang 2017-09-02
  • 打赏
  • 举报
回复
你设置超时的代码没错,现在获取wsdl时候超时 你生成的客户端,其中应该有Service和ServiceImpl ,直接按demo给的方法而不是你现在的每次调用都根据wsdl动态生成

       //创建服务访问点集合对象
        HelloServiceImplService helloServiceImplService=new HelloServiceImplService();
        //获得服务点绑定的类
        HelloServiceImpl helloService=helloServiceImplService.getHelloServiceImplPort();
        //调用服务端方法
        String returnstr=helloService.say("小明");
言惜 2017-09-01
  • 打赏
  • 举报
回复
引用 1 楼 tianfang 的回复:
上代码!

不同客户端方式不同,你用什么框架实现客户端的?

没有用框架,就是用jdk自带的wsimport.exe程序生成中间代码(wsdl文件是别人给的),然后将中间代码拷贝到客户端里,供客户端调用
代码如下:(Appsystemstatus、AppsystemstatusPortType类就是中间代码里的类)
Appsystemstatus stus = new Appsystemstatus(new URL("http://192.168.49.110:8080/TestGeneAxisServer/services/appsystemstatusHttpPort?wsdl"));
AppsystemstatusPortType apps = stus.getAppsystemstatusHttpPort();
Map<String, Object> ctxt = ((BindingProvider) apps).getRequestContext();
ctxt.put("com.sun.xml.internal.ws.connect.timeout", connectionTimeOut);
ctxt.put("com.sun.xml.internal.ws.request.timeout", waitTimeOut);

String result = apps.updateStatus("0000000000",sysStaus);
return result;
tianfang 2017-08-30
  • 打赏
  • 举报
回复
上代码! 不同客户端方式不同,你用什么框架实现客户端的?

67,514

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧