当前位置: 首页 > 知识库问答 >
问题:

CXF、Camel和Spring线程阻塞问题

罗源
2023-03-14

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

下面是我们得到的例外:

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)
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)

我还尝试使用异步客户端,虽然stacktrace和线程转储看起来不同,但结果是一样的。

这似乎也只发生在我们的开发实例(Mac笔记本电脑)上,我们在Glassfish 4.0和JDK 1.7.x(我的机器上是1.7U65,其他机器上的版本略有不同)中运行

骆驼路线之一,虽然它似乎影响了他们所有人(他们是设置相同的道路)

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

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

我们有另外两个运行在Linux上的环境,都是在JDK 1.7.0u60上,也就是glassfish的相同版本上,它们没有表现出这种行为。所有受影响的机器仅为OS X。(不久将测试windows box)

共有1个答案

后易安
2023-03-14

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

用较小的应用程序测试,我能够部署在本地不同的服务器上,一切都很好。甚至尝试将这些服务部署到Tomcat和Glassfish的前端,仍然没有问题。

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

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

 类似资料:
  • 本文向大家介绍Jquery ajax 同步阻塞引起的UI线程阻塞问题,包括了Jquery ajax 同步阻塞引起的UI线程阻塞问题的使用技巧和注意事项,需要的朋友参考一下 最近做一个项目,遇到了一个问题同步ajax引起的ui线程阻塞问题,下面把我的问题解决过程分享给大家。 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则,我封装了一个名为getData的函数,它接收

  • 我有4-5个工作线程处理大型消息队列。我还有另一段代码,它使用2-3个worker运行。我想在处理大型消息队列时阻止所有其他工作者。 我正在使用JDK6和Jms 编辑: 队列进程工作者从未终止。当没有消息时,它们阻塞队列。这些工作者由执行器线程池管理,如果我使用读写锁,其中一个工作者也会被阻塞。此外,如果使用循环屏障,那么我必须终止线程,以便重新传递阻塞的第二个进程。由于工作者是由线程池管理的,所

  • 我决定在Java上重写我的Web应用程序(以前是在Python上)。在我的应用程序中,我使用无阻塞I/O,我有工作池(Celery Eventlet线程),我在其中传递由数百个API调用组成的任务。 现在我正在使用Spring WebFlux,但我不明白如何创建一个工作人员池来将我的任务传递到该池,并在获得结果并进行一些计算之后。 (我知道创建ThreadPoolTaskExecutor的可能性,

  • 我编写了一个简单的类,我计划将其扩展为客户端套接字编程应用程序的一部分。类涉及一个BlockingQueue(我从这里复制了代码:相当于Java的BlockingQueue的C++)。当我创建了下面的包装类的一个实例后,我打算让它生成一个单独的线程,该线程只需执行BlockingQueue上阻塞的printer()函数,直到有一个或多个字符串可用,然后它只需将字符串打印到控制台窗口。在我的预期应用

  • 背景我使用log4j2(2.12.1)与同步根和异步记录器。Lmax环形缓冲区大小默认为256*1024。我在控制台的appender。我用JSON布局记录MapMessage。我的日志消息的平均大小约为100字节。 有了上面的细节,我注意到很少有线程被阻塞在 我的问题是。。 环形缓冲区是否很快就满了,这导致主线程背压(在我的例子中,servlet容器线程是http-nio-8080-exec-1

  • 我试图通过使用Camel&cxf调用第三方SOAP web服务。以下是wsdl的摘录 可以看到,soap主体使用了上面wsdl中提到的“parameters”部分,与TNS:SetDeviceDetailsV4相关。 下面是我的pom.xml文件的一部分 如何使我的Camel/CXF调用与其他开发人员所做的匹配?