2017-12-28 41 views
0

JMSトピックとの間でメッセージを送受信しようとしています。同時送信と受信

<testcase name="DeliveryToPT3PLIT"> 
     ... 
     <actions> 
      ...    
      <send endpoint="fromEndpoint"> 
       <message> 
        <resource file="com/roche/icc/citrus/messages/input/PT-3PLWoBatchSplit.xml"/> 
       </message> 
       <header> 
        ... 
       </header> 
      </send> 

      <receive endpoint="toEndpoint"> 
       <description>Receive asynchronous message from topic</description> 
       <message> 
         <resource file="com/roche/icc/citrus/messages/output/PT-3PLWoBatchSplit.xml"/> 
       </message> 
       <header> 
        ... 
       </header> 
      </receive> 
     </actions> 
    </testcase> 

これらの操作が次々と進んでいるようです。問題は、私のアプリケーションが本当に速く動作し、最初のトピックにメッセージを送るとき、すぐに "toEndpoint"に現れることです。したがって、受信操作は、すでに処理されているため、適切なメッセージをキャッチすることはできません。

この操作を同時に行う方法はありますか?

よろしく

答えて

2

JMSトピックを使用することについて注意すべき一つのことは、彼らはパブリッシュ/サブスクライブ方法で動作するため、あなたがメッセージを受信するために、第1サブスクライブする必要があります。

これは、メッセージを公開する前にトピックを購読する必要があることを意味します。また、アプリケーションが高速であると言う場合は、メッセージを送信する前に数ミリ秒待たなければならない場合があります。ここに私があなたのために働くかもしれないと思うもののJava DSLの例があります。 (注:私は、JMSトピックにこの例をテストしている)

parallel().actions(
    sequential().actions(// Thread #1 
      ... 
      receive(action -> action.endpoint(toEndpoint).payload("message to be received"))), 
    sequential().actions(// Thread #2 
      sleep(500), 
      send(action -> action.endpoint(fromEndpoint).payload("message to be sent")))); 

お知らせparallel()アクションコンテナ。別のスレッドでその中のすべてのアクションを実行します。各sequential()は、それらをまとめてグループ化する一連のアクションを表します。両方のsequential()コンテナがparallel()の内部にあるため、それぞれの内部のアクションは異なるスレッドで実行されます。

ここで何が起こるのですか?2つのスレッドでアクションを分割します。最初のスレッドでは、メッセージを待ちます。 2番目のスレッドでは、最初に500ミリ秒間スリープ状態にした後、メッセージを受信します。

私にはXMLの例はありませんが、これはとにかく役立つことを願って申し訳ありません。

また、pub-sub-domainプロパティをエンドポイントのtrueに設定することも忘れないでください。 JMSトピックに関するCitrusのドキュメントhereを参照してください。

+0

提案していただきありがとうございます!できます! XMLは次のようになるだろう: ... ... – Gandalf

+0

グレート!私はそれがうまくいってうれしいです。 – lilea

関連する問題