178.20. サンプル
JMS は、他のコンポーネントの多くの例でも使用されています。ただし、開始するためのいくつかのサンプルを以下に示します。
178.20.1. JMS からの受信
次のサンプルでは、JMS メッセージを受信し、メッセージを POJO にルーティングするルートを設定します。
from("jms:queue:foo"). to("bean:myBusinessLogic");
もちろん、任意の EIP パターンを使用して、ルートをコンテキストベースにすることができます。たとえば、次のように、高額の支出者向けに注文トピックをフィルター処理します。
from("jms:topic:OrdersTopic"). filter().method("myBean", "isGoldCustomer"). to("jms:queue:BigSpendersQueue");
178.20.2. JMS への送信
以下のサンプルでは、ファイルフォルダーをポーリングし、ファイルコンテンツを JMS トピックに送信します。ファイルの内容を BytesMessage
ではなく TextMessage
にしたいので、本文を String
に変換する必要があります。
from("file://orders"). convertBodyTo(String.class). to("jms:topic:OrdersTopic");
178.20.3. アノテーションの使用
Camel にはアノテーションもあるため、POJO Consuming と POJO Producing を使用できます。
178.20.4. Spring の DSL サンプル
前の例では、Java DSL を使用しています。Camel は Spring XML DSL もサポートしています。以下は、Spring DSL を使用した高額支出者のサンプルです。
<route> <from uri="jms:topic:OrdersTopic"/> <filter> <method bean="myBean" method="isGoldCustomer"/> <to uri="jms:queue:BigSpendersQueue"/> </filter> </route>
178.20.5. その他のサンプル
JMS は、この Camel ドキュメントだけでなく、他のコンポーネントや EIP パターンの例の多くにも登場します。そのため、ドキュメントを自由に参照してください。時間があれば、JMS を使用するこのチュートリアルをチェックしてください。ただし、Spring Remoting と Camel がどのように連携するかに焦点を当てています。Tutorial-JmsRemoting.
178.20.6. JMS を Exchange を格納するデッドレターキューとして使用する
通常、JMS をトランスポートとして使用する場合、ペイロードとしてボディーとヘッダーのみを転送します。Dead Letter Channel で JMS を使用する場合、JMS キューをデッドレターキューとして使用する場合、通常、発生した例外は JMS メッセージに格納されません。ただし、JMS デッドレターキューで transferExchange
オプションを使用して、Exchange 全体を org.apache.camel.impl.DefaultExchangeHolder
を保持する javax.jms.ObjectMessage
としてキューに格納するよう Camel に指示できます。これにより、デッドレターキューから消費し、キー Exchange.EXCEPTION_CAUGHT
を使用して Exchange プロパティーから原因の例外を取得できます。以下のデモは、これを示しています。
// setup error handler to use JMS as queue and store the entire Exchange errorHandler(deadLetterChannel("jms:queue:dead?transferExchange=true"));
次に、JMS キューから消費して問題を分析できます。
from("jms:queue:dead").to("bean:myErrorAnalyzer"); // and in our bean String body = exchange.getIn().getBody(); Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class); // the cause message is String problem = cause.getMessage();
178.20.7. エラーのみを格納するデッドレターチャネルとして JMS を使用する
JMS を使用して、原因エラーメッセージを格納したり、自分で初期化できるカスタムボディーを格納したりできます。次の例では、Message Translator EIP を使用して、失敗した交換を JMS デッドレターキューに移動する前に変換を行います。
// we sent it to a seda dead queue first errorHandler(deadLetterChannel("seda:dead")); // and on the seda dead queue we can do the custom transformation before its sent to the JMS queue from("seda:dead").transform(exceptionMessage()).to("jms:queue:dead");
ここでは、元の原因のエラーメッセージのみを変換に保存します。ただし、任意の式を使用して、好きなものを送信できます。たとえば、Bean でメソッドを呼び出したり、カスタムプロセッサーを使用したりできます。