gpt4 book ai didi

java - JBoss 和 ActiveMQ 之间挂起的 Socket.read() 线程

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:50 26 4
gpt4 key购买 nike

鉴于

  • 我的 Java 应用程序是部署到 JBoss (4.0.4GA) 的 WAR
  • 发布和订阅 ActiveMQ (5.6.0) 实例
  • Java 应用使用 Apache Camel (2.10.3) 与 ActiveMQ 进行所有集成(生产和消费)
  • JBoss 和 ActiveMQ 在他们自己的(CentOS 5.6 Final)四核虚拟服务器上,每个虚拟服务器都在不同的物理服务器上

我有一个线程挂起问题,在我的线程转储中看到以下内容:

java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(SocketInputStream.java:129)
java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
java.io.BufferedInputStream.read(BufferedInputStream.java:317)
sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687)
sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632)
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor.validateResponse(SimpleHttpInvokerRequestExecutor.java:146)
org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor.doExecuteRequest(SimpleHttpInvokerRequestExecutor.java:66)
org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.executeRequest(AbstractHttpInvokerRequestExecutor.java:136)
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:192)
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:174)
org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:142)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
$Proxy117.SigmaCruxer(Unknown Source)
com.tms.SigmaClient.SigmaClient.processMessage(SigmaClient.java:46)
com.tms.SigmaClient.SigmaServiceEndpoint.doSigma(SigmaServiceEndpoint.java:29)
com.tms.SigmaClient.SigmaServiceEndpoint.mark(SigmaServiceEndpoint.java:43)
sun.reflect.GeneratedMethodAccessor193.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:329)
org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:231)
org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:169)
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:104)
org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:74)
org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:102)
org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:72)
org.apache.camel.impl.converter.AsyncProcessorTypeConverter$ProcessorToAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:50)
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:114)
org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:284)
org.apache.camel.processor.SendProcessor.process(SendProcessor.java:109)
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:69)
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:99)
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:318)
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:209)
org.apache.camel.processor.DefaultChannel.process(DefaultChannel.java:305)
org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:102)
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:78)
org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:98)
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:89)
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:69)
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:104)
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:85)
org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:91)
org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:560)
org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:498)
org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:467)
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325)
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263)
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058)
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050)
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947)
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
java.lang.Thread.run(Thread.java:662)

根据这两个文章:(herehere),我的 JBoss 应用程序在 Socket.read() 上有一个阻塞 I/O 操作,它正在等待来自下游服务提供商(在我的例子中是 ActiveMQ)。同样,根据这些文章,罪魁祸首是以下 3 项之一:

  • ActiveMQ 处于不健康/不稳定状态并且响应太慢,导致我的监听/等待/阻塞线程挂起;或
  • ActiveMQ 实例本身没问题,但正在处理一个操作(写入 KahaDB 等),但完成时间太长,再次导致我的线程挂起;或
  • 我的 JBoss 应用程序 (WAR) 和我的 ActiveMQ 实例之间存在网络问题。

我想弄清楚这三种情况中的哪一种。该线程转储中是否有任何内容表明它是哪一个?我的理解(在阅读了那些文章之后)是,真正的挂起是客户端(阻塞)套接字没有收到它需要考虑的所有字节的事实响应完成;这意味着它没有收到来自 ActiveMQ 的任何响应,或者它只是没有收到完整的响应。

所以我问:

  1. 是否明确指出了 3 种情况中的哪一种情况?如果是这样,什么/为什么?如果不是,我的下一步应该是什么(我也是设置 ActiveMQ 的“管理员”,所以我可以完全访问它以及部署到它的 JBoss 和 WAR)。
  2. 升级到更新的 JBoss 会解决这个问题吗?也许 4.0.4GA 使用“旧”(阻塞)Java I/O,而较新的版本可能使用 NIO?可能性不大,但现在还不能抹黑它。
  3. 这两篇文章都强调应该实现正确的套接字超时配置,这可能会很好地缓解所有这些问题(尽管它没有解决底层的 ActiveMQ 无响应和/或网络问题):
    1. 这是我会在 Java 代码中编写的超时吗?如果是这样,如何以及使用什么 API? JMS?一些 ActiveMQ 客户端 jar?
    2. 这是我在操作系统级别实现的超时吗?如果是这样,我不确定如何进行...
    3. 这是我在服务器端 (ActiveMQ) 实现的超时吗?如果是,怎么做?

我想我正在接近这里的解决方案,但有点卡住了,很难透过树木看到森林。提前致谢!

最佳答案

我对 JBoss(和 Glassfish)和 ActiveMQ 有一些经验,但我以前从未使用过 Camel(但熟悉 Mule,我读到的是类似的)。

您的堆栈跟踪看起来像是 Camel 试图将 ActiveMQ(跟踪底部的 JMS 内容)链接到 Web 端点(跟踪顶部的 HTTP 内容)。

我对 Camel 的运行位置(CamelContext)感到有点困惑。你说你有两台虚拟机,一台给JBoss,一台给ActiveMQ。就我而言,我们使用 ActiveMQ 在机器上运行 Mule ESB。你的 Camel 跑哪儿去了?

您的堆栈跟踪看起来很像第一篇文章中的问题#1。就好像 Camel 部分无法“看到”网络端点一样。检查您的 WAR 是否已正确部署,以及您的 Web 端点 (WSDL) 是否从两个虚拟机可见。检查你的端点;也许一个设置为本地主机或其他东西,这将不允许它到达另一台机器。

读不全还是完全读不懂有点难说。有数据通过吗? Web 服务器可能会慢慢重载并且无法跟上请求(并且像您的错误一样使某些线程处于饥饿状态)。当响应缓慢或请求很多时,套接字超时变得很重要;如果您可以创建一个简单的测试(快速且请求很少),那么您至少可以验证您是否具有基本连接。什么数据输入(测试)导致了这个错误?

如果有更多意见,我很乐意尝试改进这个答案。 (很抱歉,我会尝试对您的问题发表评论,但我认为我还没有代表...)

关于java - JBoss 和 ActiveMQ 之间挂起的 Socket.read() 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15302029/

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