Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
挂在JBoss和ActiveMQ之间的Socket.read()线程 鉴于 我的Java应用程序是部署到JBoss(4.0.4GA)的WAR 发布并订阅ActiveMQ(5.6.0)实例 Java应用程序使用ApacheCamel(2.10.3)与ActiveMQ进行所有集成(生产和消费) JBoss和ActiveMQ各自(CentOS 5.6最终版)的四核虚拟服务器,每个虚拟服务器都位于不同的物理服务器上_Java_Multithreading_Sockets_Jboss_Activemq - Fatal编程技术网

挂在JBoss和ActiveMQ之间的Socket.read()线程 鉴于 我的Java应用程序是部署到JBoss(4.0.4GA)的WAR 发布并订阅ActiveMQ(5.6.0)实例 Java应用程序使用ApacheCamel(2.10.3)与ActiveMQ进行所有集成(生产和消费) JBoss和ActiveMQ各自(CentOS 5.6最终版)的四核虚拟服务器,每个虚拟服务器都位于不同的物理服务器上

挂在JBoss和ActiveMQ之间的Socket.read()线程 鉴于 我的Java应用程序是部署到JBoss(4.0.4GA)的WAR 发布并订阅ActiveMQ(5.6.0)实例 Java应用程序使用ApacheCamel(2.10.3)与ActiveMQ进行所有集成(生产和消费) JBoss和ActiveMQ各自(CentOS 5.6最终版)的四核虚拟服务器,每个虚拟服务器都位于不同的物理服务器上,java,multithreading,sockets,jboss,activemq,Java,Multithreading,Sockets,Jboss,Activemq,我有一个线程挂起问题,并在我的线程转储中看到以下内容: java.net.SocketInputStream.socketRead0(Native Method) java.net.SocketInputStream.read(SocketInputStream.java:129) java.io.BufferedInputStream.fill(BufferedInputStream.java:218) java.io.BufferedInputStream.read1(BufferedInp

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

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)
根据这两篇文章:(和),我的JBoss应用程序在
Socket.read()
上有一个阻塞I/O操作,它正在等待下游服务提供商(在我的例子中是ActiveMQ)的完整响应。同样,根据这些条款,罪犯是以下3项之一:

  • ActiveMQ处于不健康/不稳定状态,响应太慢,导致侦听/等待/阻塞线程挂起;或
  • ActiveMQ实例本身没有问题,但正在处理一个操作(写入KahaDB等),该操作花费的时间太长,再次导致线程挂起;或
  • 我的JBoss应用程序(WAR)和我的ActiveMQ实例之间存在网络问题
我想知道这三种情况中哪一种是正确的。线程转储中是否有任何东西可以指示它是哪一个?我的理解(阅读了这些文章)后,真正的悬念是客户端(阻塞)套接字没有接收到需要考虑响应完成的所有字节;这意味着它没有收到来自ActiveMQ的任何响应,或者只是没有收到完整响应

所以我问:

  • 是否有明确的迹象表明这三种情况中的哪一种是正确的?如果是,什么/为什么?如果没有,我的下一步应该是什么(我也是设置ActiveMQ的“管理员”,因此我可以完全访问它以及JBoss和部署到它的WAR)
  • 升级到更新的JBoss会解决这个问题吗?也许4.0.4GA使用的是“旧”(阻塞)Java I/O,而新版本可能使用NIO?可能是一个很长的机会,但目前还不能抹黑它
  • 这两篇文章都强调应该实现适当的套接字超时配置,这可能会很好地缓解所有这些问题(尽管它没有解决潜在的ActiveMQ无响应和/或网络问题):
  • 这是我在Java代码中编写的超时吗?如果是,如何使用什么API?JMS?一些ActiveMQ客户端jar
  • 这是我在操作系统级别实现的超时吗?如果是这样,我不知道如何继续
  • 这是我在服务器端(ActiveMQ)实现的超时吗?如果是,怎么做

  • 我想我正在接近一个解决方案,但是有点卡住了,很难通过树木看到森林。提前谢谢

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

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

    我有点搞不清楚骆驼在哪里跑(骆驼上下文)。您说过您有两个虚拟机,一个用于JBoss,另一个用于ActiveMQ。在我的例子中,我们使用ActiveMQ在机器上运行Mule ESB。你的骆驼跑哪去了

    您的堆栈跟踪看起来最像第一篇文章中的问题#1。就好像驼峰部分无法“看到”web端点一样。检查您的WAR是否正确部署,以及您的web端点(WSDL)是否在两个虚拟机上都可见。检查你的端点;可能其中一个被设置为localhost或其他什么,这将不允许它访问另一台机器

    很难判断这是不完整的阅读还是完全不能阅读。有数据通过吗?有可能Web服务器正在缓慢过载,无法跟上请求(并且在您的错误中导致一些线程不足)。当响应速度慢或请求多时,套接字超时变得很重要;如果您可以创建一个简单的测试(快速且请求很少),那么您至少可以验证您是否具有基本的连接性。什么数据输入(测试)导致此错误


    如果有更多的投入,我很乐意尝试改进这个答案。(很抱歉,我本想试着对你的问题发表评论,但我想我还没有这方面的代表…

    谢谢@Seka(+1)-为你提供更多信息。骆驼路线在部署到JBoss的战争中“生存”(开始)。驼峰路由用作JMS客户端,ActiveMQ用作JMS服务器。这只是偶尔发生的,在Camel和ActiveMQ之间99.99%的发布/订阅通过OK。问题是,每隔一段时间(数百万条消息),我就会看到
    socketRead0
    (阻塞读取)和驼峰线程开始挂起。它挂起是因为它正在等待ActiveMQ的完整响应,但没有得到响应。消息大小是否可变?值得知道的是,导致挂起的是单个大消息还是大量并发消息。对于前者,增加套接字超时将有所帮助;对于后者,增加工作线程的数量可能会有所帮助。从堆栈跟踪来看,驼峰线程似乎挂在套接字(Web)端,而不是JMS端,好像它试图从套接字中提取数据并将其发送到JMS,但没有获得数据(或者至少没有及时)。再次感谢@Seka(+1)-这是一个应用程序,它有64个使用者线程侦听ActiveMQ实例上的队列。消息一进入队列,64个消费者中的一个就会拿起它并开始处理它。这些消息的大小略有不同(它们的大小都有点不同,但通常是相同的),每天有数十万条消息;有时甚至更多。好奇:是什么让你认为这是挂在网上的?做