2012-05-14 26 views
2

私はCamelとWebSphereを統合しようとしています。一つのことを除いて、うまくいきます。WebSphere Camel JMS、spring、taskExecutor、haningingスレッド

このシナリオは、 JMS(WMQ) - >ルーティング/変換 - > BEAN(JPA(OpenJPA1.2/DB2)コミットを行います)のようになります。差し込むことができるように

トランザクションマネージャとmangaedスレッドWAS、私はラクダでの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); 

このwasTaskExecutor Beanは、アプリケーション内の1つのスタンドアロンの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(ネイティブ・メソッド) at 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) 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) at org.springframework.scheduling.commonj.WorkManagerTaskExecutor.execute(WorkManagerTaskExecutor.java:154) at org.springframework.jms.listener。 org.springframework.jms.listener.AbstractJmsListeningContainer.doStartでorg.springframework.jms.listener.AbstractJmsListeningContainer.resumePausedTasks(AbstractJmsListeningContainer.java:536) でDefaultMessageListenerContainer.doRescheduleTask(DefaultMessageListenerContainer.java:669) (AbstractJmsListeningContainer.java:285) at org.springframework.jms.listener.AbstractJmsListeningContainer.start(AbstractJmsListeningContainer.java:263) at org.springframework.jms.listener.DefaultMessageListenerContainer.start(DefaultMessageListenerContainer.java:555) at org.apache.camel.component.jms.JmsConsumer.startListenerContainer(JmsConsumer.java:84)

これを見た人は誰ですか?

答えて

1

スレッドは完全なキューに作業をサブミットするのを待つ "ハング"し、キューがいっぱいになったときにエラーをスローするのではなく、ブロックするように作業マネージャーを設定します。 「ハング」を解決するには、作業マネージャーのスレッドプール内のスレッド数を増やすか、キューのフルアクションを「待機」ではなく「エラー」に変更します。あるいは、何らかの理由で作業マネージャーに提出される作業項目が長すぎるかどうかを調べてください。

+0

このようです。根本的な原因を探すためにヒープダンプを深く掘り下げてください。ラッキーな私、ラクダはオープンソースなので、可能なはずです。 –

関連する問題