2012-05-14 45 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

似乎喜歡它。儘管如此,你可以深入挖掘堆轉儲來尋找根本原因。幸運的是,駱駝是開源的,所以它應該是可能的。 –