2017-04-17 5 views
0

私のアグリゲータの出力チャネルであるQueueChannelがあります。このコードは、単一のノードクラスタでうまく動作します。私は2ノードクラスタに展開する瞬間、partitionStepは完了せず、STARTED状態にとどまります。 PartitionStepを見ると、受信メソッドで待機しているように見え、ステップが完了したことを決してマークしません。以下は私が使用している構成です。2ノードクラスタに展開すると、分割されたステップが開始状態のままです

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"> 
     <property name="environment"> 
      <props> 
       <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop> 
       <prop key="java.naming.provider.url">${oag_wl_nodes_url}</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiTemplate" ref="jndiTemplate" /> 
     <property name="jndiName" value="jmsConnectionFactory" /> 
    </bean> 

    <int:channel id="requestsChannel" /> 

    <bean id="reqQueue" class="org.springframework.jndi.JndiObjectFactoryBean" 
     lazy-init="true" scope="prototype"> 
     <property name="jndiTemplate"> 
      <ref bean="jndiTemplate" /> 
     </property> 
     <property name="jndiName"> 
      <value>masterRequestQueue</value> 
     </property> 
    </bean> 

    <int-jms:outbound-channel-adapter 
     connection-factory="connectionFactory" channel="requestsChannel" destination="reqQueue" /> 

    <int:channel id="replyChannel" /> 

    <bean id="replyQueue" class="org.springframework.jndi.JndiObjectFactoryBean" 
     lazy-init="true" scope="prototype"> 
     <property name="jndiTemplate"> 
      <ref bean="jndiTemplate" /> 
     </property> 
     <property name="jndiName"> 
      <value>masterReplyQueue</value> 
     </property> 
    </bean> 

    <int-jms:message-driven-channel-adapter connection-factory="connectionFactory" destination="replyQueue" 
      channel="replyChannel" acknowledge="transacted" /> 

    <int:channel id="aggregatedReplyChannel"> 
     <int:queue /> 
    </int:channel> 

    <int:aggregator ref="partitionHandler" 
      input-channel="replyChannel" output-channel="aggregatedReplyChannel" /> 

答えて

0

共通の応答キューreplyQueueを使用しています。 2つのインスタンスが応答を競合しており、応答が非マスターノードによって消費される可能性があるため、動作しません。

それぞれに個別の返信先が必要です。あなたはそれが簡単に使用することを見つけるかもしれない

..私はあなたが送信メッセージにまったくのreplyToを設定する表示されていないので、私はあなたのreplyToが、消費者側にハードコードされていると仮定し、言っ

一対のチャネルアダプタの代わりにアウトバウンドゲートウェイ。ゲートウェイは各要求に対して一時的な応答キュー(デフォルト)を作成します。

+0

こんにちはゲイリー、返信いただきありがとうございます。私たちは共通の応答キューを使用しているからです。アグリゲーターがその応答キューから読み取り、メッセージをキューチャネルに入れることができます。上記のアグリゲータ設定では、入力チャネルがreplychannelであり、出力チャネルがキューチャネルであるaggregatedReplyChannelであることが示されています。メッセージ駆動型のチャネルアダプタを使用してリプライキューから何も消費しないようにすることはできません。アグリゲータはマスターノードの応答キューからのメッセージを消費し、それらを出力チャネルに置きます。 aggregatedReplyChannel。 – anuj

+0

ここにいくつかの背景があります。この場合のジョブは、マスターノードとして扱うことができる1つのノードからトリガーされるエンドポイントから呼び出されます。マスター構成はこのノードからのみロードする必要があると想定しています。私たちの仮定は正しいですか?マスター構成は他のノードからも起動されますか?私たちのスレーブ設定は、サーバー起動時にスプリングリスナーを使用してロードされる別の設定ファイルです。両方のクラスタノードがリクエストキューをリッスンします。 – anuj

+0

すべてのノードをピアとして、実行時に1つを選択するのが一般的です仕事を開始するその場合、それぞれに専用の返信チャネルが必要です。応答キューに1つのマスターと1つのコンシューマしかない場合は、問題ではありません。チャンネルの種類は関係ありません。 DEBUGロギングを有効にして、マスタとスレーブの両方のメッセージに従うことをお勧めします。 –

関連する問題