我正在尝试将 Camel 与 WebSphere 集成。除了一件事之外,它工作得很好。
场景如下:
JMS (WMQ) -> 路由/转换 -> BEAN(执行 JPA (OpenJPA1.2/DB2) 提交)。
为了能够插入WAS事务管理器和mangaed线程,我将工作管理器作为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)以及预期的行为。
部署/启动时,可以通过这种方式处理一条消息(下面的第一个日志行) - 然后线程开始挂起。
[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 个线程可能挂起。
在 java.lang.Object.wait(本机方法)
在 java.lang.Object.wait(Object.java:196)
在 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)
有人见过这个吗?