WebSphere Camel JMS,spring,taskExecutor,haninging Threads

时间:2012-05-14 07:49:00

标签: spring java-ee jms websphere apache-camel

我正在尝试将Camel与WebSphere集成。除了一件事以外,它工作得很好。

场景如下:   JMS(WMQ) - >路由/转换 - > BEAN(执行JPA(OpenJPA1.2 / DB2)提交)。

为了能够插入WAS事务管理器和漫画线程,我将工作管理器作为taskExecutor插入到camel中:

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

这个wasTaskExecutor bean在应用程序中的一个独立的spring消息监听器(相同的jms提供程序,WMQ)中使用,并具有预期的行为。

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

[5/12/12 22:14:55:890 CEST] 00000055 SystemOut O INFO routeFromBackend - 从队列拉到消息框的消息

[5/12/12 22:27:00:638 CEST] 00000031 ThreadMonitor W WSVR0605W:线程“默认值:1”(0000001e)已激活739306毫秒且可能挂起。服务器中总共有1个线程可能挂起。     at java.lang.Object.wait(Native Method)     在java.lang.Object.wait(Object.java:196)     at com.ibm.ws.util.BoundedBuffer.waitPut_(BoundedBuffer.java:214)     在com.ibm.ws.util.BoundedBuffer.put(BoundedBuffer.java:324)     在com.ibm.ws.util.ThreadPool.execute(ThreadPool.java:1296)     在com.ibm.ws.util.ThreadPool.execute(ThreadPool.java:1100)     在com.ibm.ws.asynchbeans.WorkItemImpl $ PoolExecuteProxy.run(WorkItemImpl.java:198)     在com.ibm.ws.asynchbeans.WorkItemImpl.executeOnPool(WorkItemImpl.java:219)     在com.ibm.ws.asynchbeans.WorkManagerImpl.queueWorkItemForDispatch(WorkManagerImpl.java:433)     在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)     在org.apache.camel.component.jms.JmsConsumer.startListenerContainer(JmsConsumer.java:84)

有没有人见过这个?

1 个答案:

答案 0 :(得分:1)

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