2012-05-14 48 views
2

我正在尝试将Camel与WebSphere集成。它工作正常,除了一件事外。WebSphere Camel JMS,spring,taskExecutor,haninging线程

该方案如下所示: JMS(WMQ) - > routing/transformation - > BEAN(它执行JPA(OpenJPA1.2/DB2)提交)。

为了能够插入到WAS事务管理器和mangaed线程,我将工作管理器作为taskExecutor的骆驼:

<!-- Selected parts of the spring config --> 
<tx:jta-transaction-manager/> 

<bean id="wasTaskExecutor" 
    class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor"> 
    <property name="workManagerName" value="wm/default" /> 
</bean> 

<bean id="camelTransactionRequired" class="org.apache.camel.spring.spi.SpringTransactionPolicy" depends-on="transactionManager"> 
    <property name="transactionManager" ref="transactionManager"/> 
    <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/> 
</bean> 

<bean id="jms" class="org.apache.camel.component.jms.JmsComponent"> 
    <property name="connectionFactory" ref="connectionFactory"/> 
    <property name="taskExecutor" ref="wasTaskExecutor"/> 
    <property name="transacted" value="true"/> 
    <property name="transactionManager" ref="transactionManager"/> 
</bean> 

然后路由,是这样的:

from("jms:queue:MY.QUEUE") 
    .transacted("camelTransactionRequired") 
    .log(..) 
    .bean(storeJPA); 

这是TaskExecutor bean在应用程序中的一个独立的弹簧消息侦听器(相同的jms提供程序,WMQ)中使用以及预期的行为。

部署/启动时,可以以这种方式处理一条消息(下面的第一条日志行) - 然后线程开始挂起。

[12年5月12日22:14:55:890 CEST] 00000055 SystemOutöINFO routeFromBackend - 消息从队列拉出到消息框

[12年5月12日22:27:00:638 CEST ] 00000031线程监视器WSVR0605W:线程“默认值:1”(0000001e)已激活739306毫秒并可能挂起。总共有1个线程可以挂在服务器上。 在java.lang.Object.wait(本机方法) 在java.lang.Object.wait(Object.java:196) 在com.ibm.ws.util.BoundedBuffer.waitPut_(BoundedBuffer.java:214) at com.ibm.ws.util.BoundedBuffer.put(BoundedBuffer.java:324) at com.ibm.ws.util.ThreadPool.execute(ThreadPool.java:1296) at com.ibm.ws.util.ThreadPool .execute(ThreadPool.java:1100) at com.ibm.ws.asynchbeans.WorkItemImpl $ PoolExecuteProxy.run(WorkItemImpl.java:198) at com.ibm.ws.asynchbeans.WorkItemImpl.executeOnPool(WorkItemImpl.java:219 ) at com.ibm.ws.asynchbeans.WorkManagerImpl.queueWorkItemForDispatch(WorkManagerImpl.java:433) at com.ibm.ws.asynchbeans.WorkManagerImpl.schedule(WorkManagerImpl.java:1074) 在com.ibm.ws.asynchbeans.WorkManagerImpl.schedule(WorkManagerImpl.java:846) 在org.springframework.scheduling.commonj.WorkManagerTaskExecutor.execute(WorkManagerTaskExecutor.java:154) 在org.springframework.jms.listener。 DefaultMessageListenerContainer.doRescheduleTask(DefaultMessageListenerContainer.java:669) 在org.springframework.jms.listener.AbstractJmsListeningContainer.resumePausedTasks(AbstractJmsListeningContainer.java:536) 在org.springframework.jms.listener.AbstractJmsListeningContainer.doStart(AbstractJmsListeningContainer.java:285) 在org.springframework.jms.listener.AbstractJmsListeningContainer.start(AbstractJmsListeningContainer.java:263) 在org.springframework.jms.listener.DefaultMessageListenerContainer.start(DefaultMessageListenerContainer.java:555) at org.apache.camel.component.jms.JmsConsumer.startListenerContainer(JmsConsumer.java:84)

有没有人看到这个?

回答

1

线程处于“挂起”状态,等待将工作提交到完整队列,并且工作管理器配置为在队列满时阻塞而不是抛出错误。要解决“挂起”问题,可以增加工作管理器线程池中的线程数,也可以将队列完整操作更改为“错误”而不是“等待”。或者,调查提交给工作经理的工作项目是否由于某种原因而花费太长时间。

+0

似乎喜欢它。尽管如此,你可以深入挖掘堆转储来寻找根本原因。幸运的是,骆驼是开源的,所以它应该是可能的。 –