Wildfly 8.2/undertow 读取超时

2023-12-13

我最近使用java1.8将我的项目从jboss4迁移到wildfly 8.2。我有一个使用 SAAJ 的 Web 服务调用,它在命令行中运行良好。但是当它从 Wildfly8.2 内部运行时,它会在 60 秒后超时。我从 jboss 论坛上了解到,读取请求的默认超时时间为 60 秒。所以我将standalone.xml中的配置更改为

            <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 秒后仍然超时,并出现以下错误。

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)

I read here我可以设置超时,但我不必这样做,因为程序运行良好,不会从命令行超时,所以它不是 saaj 超时问题。我很确定 Wildfly/undertow 出于某种原因正在对套接字的读出进行计时。

任何帮助表示赞赏。

- -更多细节 - -

目前我使用的是 Wildfly8.2 附带的 undertow 1.1 Final。我尝试将 undertow 升级到 1.2 beta,结果仍然相同。

调用失败:

        responseMsg = soapConn.call(soapMessage, wsdlLoc);

Wildfly8.2 中的 Undertow 配置:

    <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 Web 服务调用是从在 wildfly8.2 中运行的 servlet 进行的,目标 WSDL 位于另一台 jboss 服务器上。所以基本上,来自 wildlfy 的客户端 Web 服务调用会在 60 秒内超时,但如果我从独立的 Java 客户端运行相同的调用并且相同的代码工作得很好。我什至开了一个线程jboss社区我还没有听到任何消息


我能够通过更改 apache-cxf 源中的接收超时并为 wildfly8.2 重建它来解决此问题

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

  1. 从apache下载CXF2.7.15 src
  2. 下载jdk1.6最新版本
  3. 下载3.0.4
  4. 导出 JAVA_HOME=jdk1.6 路径
  5. 将 jdk1.6/bin 和 maven/bin 添加到 PATH
  6. 导出 MAVEN_OPTS=-Xmx512m 修复 permgen 错误
  7. 打开 ./rt/transports/http/src/main/resources/schemas/wsdl/http-conf.xsd 并将 ReceiveTimeout 从 60000 更改为例如所需的任何值。 600000(10分钟)
  8. 运行 mvn -Pfastinstall

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

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

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Wildfly 8.2/undertow 读取超时 的相关文章

随机推荐