首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wildfly 8.2/undertow读取超时

Wildfly 8.2/undertow读取超时
EN

Stack Overflow用户
提问于 2015-03-27 23:04:10
回答 3查看 11.9K关注 0票数 4

我最近将我的项目从jboss4迁移到了带有java1.8的wildfly 8.2。我有一个使用SAAJ的webservice调用,它在命令行中运行良好。但是当它在wildfly8.2中运行时,它会在60秒后超时。我在jboss论坛上看到,读请求的默认超时时间是60秒。因此,我将standalone.xml中的配置更改为

代码语言:javascript
复制
            <ajp-listener name="ajp" socket-binding="ajp" max-parameters="10000"/>
            **<http-listener name="default" socket-binding="http" max-parameters="10000" read-timeout="120000"/>**
            <host name="default-host" alias="localhost">
                <location name="/" handler="welcome-content"/>
                <filter-ref name="server-header"/>
                <filter-ref name="x-powered-by-header"/>
            </host>

但它仍然在60秒后超时,并出现以下错误。

代码语言:javascript
复制
Caused by: java.net.SocketTimeoutException: SocketTimeoutException invoking http://test-server/test/v2.0.0/TestService?wsdl: Read timed out
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [rt.jar:1.8.0_25]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) [rt.jar:1.8.0_25]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [rt.jar:1.8.0_25]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) [rt.jar:1.8.0_25]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1347)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1331)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:632)
    at org.jboss.wsf.stack.cxf.saaj.SOAPConnectionImpl.call(SOAPConnectionImpl.java:120)
    ... 38 more
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method) [rt.jar:1.8.0_25]
    at java.net.SocketInputStream.read(SocketInputStream.java:150) [rt.jar:1.8.0_25]
    at java.net.SocketInputStream.read(SocketInputStream.java:121) [rt.jar:1.8.0_25]
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246) [rt.jar:1.8.0_25]
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:286) [rt.jar:1.8.0_25]
    at java.io.BufferedInputStream.read(BufferedInputStream.java:345) [rt.jar:1.8.0_25]
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:703) [rt.jar:1.8.0_25]
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:647) [rt.jar:1.8.0_25]
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1534) [rt.jar:1.8.0_25]
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439) [rt.jar:1.8.0_25]
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) [rt.jar:1.8.0_25]
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:266)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1545)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1515)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1318)

我在here上读到我可以设置超时,但我不需要这样做,因为程序在命令行没有超时的情况下运行得很好,所以这不是saaj超时问题。我非常确定wildfly/undertow出于某种原因正在计时套接字的读出。

任何帮助都是非常感谢的。

-更多细节

目前我使用的是wildfly8.2附带的undertow 1.1最终版。我试着把undertow升级到1.2测试版,结果还是一样的。

调用失败:

代码语言:javascript
复制
        responseMsg = soapConn.call(soapMessage, wsdlLoc);

wildfly8.2中的底层配置:

代码语言:javascript
复制
    <subsystem xmlns="urn:jboss:domain:undertow:1.2">
        <buffer-cache name="default"/>
        <server name="default-server">
            <ajp-listener name="ajp" socket-binding="ajp" max-parameters="10000"/>
            <http-listener name="default" socket-binding="http" max-parameters="10000" read-timeout="120000"/>
            <host name="default-host" alias="localhost">
                <location name="/" handler="welcome-content"/>
                <filter-ref name="server-header"/>
                <filter-ref name="x-powered-by-header"/>
            </host>
        </server>
        <servlet-container name="default">
            <jsp-config/>
            <websockets/>
        </servlet-container>
        <handlers>
            <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
        </handlers>
        <filters>
            <response-header name="server-header" header-name="Server" header-value="WildFly/8"/>
            <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
        </filters>
    </subsystem>

更多细节:

我在wildfly9.0BETA2下尝试了一下,结果是一样的。只想分享更多的细节,如果有帮助的话。SAAJ webservice调用是从在wildfly8.2中运行的servlet发出的,而目标WSDL在另一个jboss服务器上。因此,基本上,从wildlfy调用客户端webservice会在60秒内超时,但如果我从一个独立的java客户端运行相同的调用,并且相同的代码工作得很好。我甚至在jboss community上开了一个帖子,还没有听到任何消息

EN

回答 3

Stack Overflow用户

发布于 2015-04-02 02:05:26

我能够通过更改apache-cxf源代码中的接收超时并为wildfly8.2重新构建它来修复这个问题

简要说明:(版本必须与这些版本完全相同,否则编译失败)。

从apache

  • Download jdk1.6下载CXF2.7.15src最新的release

  • Download 3.0.4打开

  • 导出apache

  • Download jdk1.6/和maven/bin到PATH
  1. export MAVEN_OPTS=-Xmx512m以修复永久错误
  2. ReceiveTimeout并将ReceiveTimeout从60000更改为例如所需的任何内容。600000 (10分钟)运行mvn -Pfastinstall

具有HTTPConduit套接字超时的文件是位于./rt/transports/http/target/cxf-rt-transports-http-2.7.15.jar.中的HTTPClientPolicy.java将此jar复制到apache/cxf/impl/main文件夹下的wildfly8.2模块中。另外,编辑module.xml以使用此jar。

我还必须将standalone.xml中的undertow读取超时设置更改为更高的值,以阻止它重新尝试请求。

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2015-04-28 23:14:10

或者,此问题已在wildfly 9中得到解决。开发人员可以通过设置系统属性来覆盖默认的CXF HTTP管道值。欲了解更多详情,请访问https://docs.jboss.org/author/display/WFLY9/Apache+CXF+integration#ApacheCXFintegration-ApacheCXFinterceptors

票数 0
EN

Stack Overflow用户

发布于 2015-12-22 22:12:46

足以将以下代码添加到您的add服务使用者中:

代码语言:javascript
复制
//import javax.xml.ws.BindingProvider;

//Set timeout until a connection is established
((BindingProvider)this.myService).getRequestContext().put("javax.xml.ws.client.connectionTimeout", "60000"); //one minute

//Set timeout until the response is received
        ((BindingProvider)this.myService).getRequestContext().put("javax.xml.ws.client.receiveTimeout", "600000"); //ten minutes
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29303854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档