0

データをマーシャリングおよびアンマーシャリングするように Camel を構成する方法について、誰かがもう少し説明してくれることを願っています。受信者リストを決定するために Bean を呼び出すルートがあります。これは、メッセージの内容 (protobuf) に基づいています。

ルート構成は次のようになります:-

    <route id="Splitter">
        <from uri="activemq:notification.splitter" />
        <unmarshal ref="notificationProto" />
        <recipientList>
            <method bean="NotificationSplitter" method="splitNotification" />
        </recipientList>
    </route>

Bean は正常に動作しますが、ダウンストリーム ルートは次のように不平を言います:-

org.apache.camel.RuntimeCamelException: java.lang.RuntimeException: Unable to find proto buffer class

ダウンストリーム ルートには、上記のルートとまったく同じ protobuf dataFormat 構成があります。ダウンストリーム キューに直接ルーティングする (つまり、Bean をバイパスし、"to" キューをハードコードする) 場合、つまりアンマーシャリングの手順もスキップできるため、問題なく動作します。

Camel がメッセージを宛先キューに入れる前に、データを再マーシャリングする必要があると思いますが、XML 内でこれを構成する方法がわかりません。単純に追加してみました...

<marshal ref="notificationProto" />

... recipientListが決定された後、それは行われません(それまでにCamelがメッセージをすでにディスパッチしているためだと思います)。

別の方法として、Bean 内からアンマーシャリングを行うこともできます。これは、交換上のデータがおそらく変更されないままになるためです。これを行う方法がよくわかりません。それはうまくいくでしょうか?

ヒントをありがとう。

J.

4

1 に答える 1

0

ええ、データ形式はメッセージの送信が簡単なエンドポイントではありません。そうでない場合は、代わりにルーティングスリップEIPパターンを使用して、最初にデータ形式にメッセージを送信し、次に宛先にメッセージを送信できます。http://camel.apache.org/routing-slip.html

あなたは少しルートを持つことができますが

<route>
  <from uri="direct:marshalMe"/>
  <marshal ref="notificationProto" />
</route>

次に、ルーティングスリップを使用して、「direct:marshalMe、whereYouWannaGoNext」に設定します。

別の方法は、インターセプターを使用し、エンドポイントへの送信をインターセプトして(ワイルドカード、またはreg expsでフィルター処理できます)、最初にマーシャルを実行することです。http://camel.apache.org/intercept 詳細については、そのリンクを参照してください。

于 2012-11-18T11:57:35.563 に答える