gpt4 book ai didi

java - CXF、Camel 和 Spring 线程阻塞问题

转载 作者:太空宇宙 更新时间:2023-11-04 14:32:59 24 4
gpt4 key购买 nike

问题在于 Camel 和 CXF(端点和客户端)以及同时触发的多个请求。

这是我们得到的异常:

java.net.SocketException: Unexpected end of file from server
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:772)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1323)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.getResponseCode(URLConnectionHTTPConduit.java:266)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1543)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1513)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1318)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:632)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:570)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:479)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)

我尝试使用 SoapUI 负载测试直接访问端点,但无法重现该问题。它只会通过 spring jaxws:client bean 发生。

客户端每次发出一个请求都可以正常工作,只有当我们尝试执行多个请求时,我们才不会看到错误。

还在线程等待时执行线程转储,所有请求(其中 5 个)如下所示:

http-listener-1(1)" daemon prio=5 tid=0x00007fa2843e8800 nid=0x9d07 in Object.wait() [0x000000018a266000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000001708b27e8> (a org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit$AsyncWrappedOutputStream)
at org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit$AsyncWrappedOutputStream.getHttpResponse(AsyncHTTPConduit.java:562)
- locked <0x00000001708b27e8> (a org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit$AsyncWrappedOutputStream)
at org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit$AsyncWrappedOutputStream.getResponseCode(AsyncHTTPConduit.java:674)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1543)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1513)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1318)
at org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit$AsyncWrappedOutputStream.close(AsyncHTTPConduit.java:383)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:632)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
- locked <0x00000001704175f8> (a org.apache.cxf.phase.PhaseInterceptorChain)
at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:570)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:479)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)

我还尝试使用异步客户端,虽然堆栈跟踪和线程转储看起来不同,但结果是相同的。

这似乎也只发生在我们的开发实例(Mac 笔记本电脑)上,并且我们在带有 JDK 1.7.x 的 Glassfish 4.0 中运行它(我的计算机上为 1.7u65,其他计算机上的版本略有不同)

其中一条 Camel 路线,尽管它似乎影响所有路线(并且它们的设置方式相同)

from("cxf:/structure?serviceClass=" + StructureEndpoint.class.getName() + "&loggingFeatureEnabled=true")
.routeId("structure")
.to("log:com.test.camel")
.recipientList(simple("direct:structure:${header.operationName}"));

当发生这种情况时,我永远不会看到由loggingFeatureEnabled启用的camel/cxf日志输出,因此我们也看不到我们的.to(“log:*”)输出。它永远不会到达这里。

可重现的测试:

SoapUI,简单的负载测试。在 5 开始/结束线程开始测试,前 5 个请求出现错误。测试通过我们的前端,它使用 cxf 客户端来访问后端camel/cxf 服务。

直接点击camel/cxf服务不会导致任何问题。

环境测试更新

我们还有另外 2 个环境在 Linux 上运行,都在 JDK 1.7.0u60 上,玻璃鱼的版本相同,但不表现出此行为。所有受影响的机器仅限 OS X。 (很快就会测试 Windows 盒子)

最佳答案

对我能够测试的较小样本进行一些隔离和测试后,发现了问题。

使用较小的应用程序进行测试,我能够部署在本地执行不同的服务器,并且一切正常。即使尝试将服务部署到 Tomcat 和 Glassfish 上的前端,仍然没有问题。

一旦我将前端和后端放在同一台服务器上,如果我同时向其发送 5 个请求,它就会卡住。我还尝试使用 JAX-WS 生成的(而不是 CXF)服务,但它们也有同样的问题,排除了 CXF 特定问题的问题。

根本问题

Glassfish 的默认 http 线程池最大值为 5。因此,一旦我们尝试同时执行 5 个或更多请求....blamo!从技术上讲,如果我们尝试 5 个请求,我们实际上对资源执行了 10. 5 个请求,然后资源会出去并对后端本身执行 5 个请求。

解决方案

有几件事可以解决这个问题。增加 glassfish 中线程池的大小。无论如何,5 看起来很小,所以无论如何都需要调整。

另一种方法是简单地将两个应用程序放在不同的服务器上,这将是生产配置的方式,但可能会增加本地开发的大量开销。

Unresolved 问题

唯一未知的是为什么我们在 Linux qa/dev 环境中看不到这一点。与这些的不同之处在于它们前面有 apache,而我们的本地实例没有。

关于java - CXF、Camel 和 Spring 线程阻塞问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25915621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com