1

最終メッセージへの応答が前のメッセージに基づく必要があるminaサービスを実装しようとしています。各メッセージ(ヘッダー(1)、データ(n)、終了(1))は応答を受信する必要がありますが、「終了」メッセージへの応答は「ヘッダー」と受信した「データ」メッセージに基づいている必要があります。 「終了」メッセージとして。現在、特定の相関IDの「ヘッダー」および「終了」メッセージが見つかると完了するアグリゲーターにメッセージをルーティングしています。残念ながら、応答はメッセージがアグリゲーターに送信される前に(または同時に?)送信されるため、正しい応答を作成するために必要なすべてのデータを含む集約されたメッセージにアクセスできません。応答を構築します。

蓄積されたデータを手動で保存してアクセスせずに(つまり、ラクダのアグリゲーターを再実装せずに)これを行う方法はありますか?

編集:

ルートは次のようなものです。

<camelContext>
    <route>
        <from uri="mina:..."/>
        <process ref="messageProcessor"/>
        <aggregate>
            <process ref="completeMessageProcessor"/>
        </aggregate>
    </route>
</camelContext>

わかりやすくするために、いくつかのタグと属性(、、など)を省略しましたcorrelationExpressioncompletionPredicatestrategyRef

メッセージは適切に集約されており、「完了」したとき(つまり、集約されたとき)に適切に処理されていました。minaただし、エンドポイントを介してクライアントに返送される応答は、によって生成されたものであり、によって生成されたmessageProcessorものではありませんcompleteMessageProcessor

たとえば(そして、はい、それはかなり不自然な例ですが、私に耐えてください)、プロトコルが、クライアントが送信することを期待するデータメッセージの総数を含むヘッダーメッセージを送信することを含むとしましょう。次に、いくつかのデータメッセージを送信しますが、送信する予定のデータメッセージとは数が異なる場合があります。最後に、フッターまたは終了メッセージを送信します。その後、サーバーは、予想されるメッセージ数と実際のメッセージ数の差で応答する必要があります。messageProcessor記述されたルートでは、個々のメッセージのみを処理するによってメッセージの数がわからないため、これは不可能です。集約されたメッセージ(ヘッダー、すべてのcompleteMessageProcessorデータ、および終了で構成される)を持つminaこの番号はわかっていますが、その時点で生成された応答はエンドポイントに伝播されません。

サーバーは個々のメッセージに応答する必要があるため、メッセージの解析を変更して、作成されたメッセージ全体が受信された場合にのみメッセージを生成することはできません。

4

1 に答える 1

1

一番上から、私の推測では、messageProcessorはOUTメッセージを設定していますが、completeMessageProcessorはINメッセージを設定しています。minaコンシューマー の応答は、代わりにOUTメッセージを予期/使用しています。

これを確認するためにログを追加できます。この場合、messageProcessor代わりにIN本文を使用するように変更し(またはexchangesヘッダーを使用)、後に変換を追加completeMessageProcessorして、IN本文に基づいてOUT本文を設定することができます。

<transform>
  <simple>${in.body}</simple>
</transform>

詳細については、これを参照してください: http: //camel.apache.org/using-getin-or-getout-methods-on-exchange.html

更新:いくつかの議論の後、本当の問題は、アグリゲーターが現在「InOnly」交換のみを処理することです

于 2012-08-11T03:32:01.900 に答える