178.6. サンプル
JMS は、他のコンポーネントの多くの例でも使用されています。ただし、開始するためのいくつかのサンプルを以下に示します。
178.6.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.6.2. JMS への送信
以下のサンプルでは、ファイルフォルダーをポーリングし、ファイルコンテンツを JMS トピックに送信します。ファイルの内容を BytesMessage
ではなく TextMessage
にしたいので、本文を String
に変換する必要があります。
from("file://orders"). convertBodyTo(String.class). to("jms:topic:OrdersTopic");
178.6.3. アノテーションの使用
Camel にはアノテーションもあるため、POJO Consuming と POJO Producing を使用できます。
178.6.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.6.5. その他のサンプル
JMS は、この Camel ドキュメントだけでなく、他のコンポーネントや EIP パターンの例の多くにも登場します。そのため、ドキュメントを自由に参照してください。
178.6.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.6.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 でメソッドを呼び出したり、カスタムプロセッサーを使用したりできます。
178.6.8. JMS を使用してコンシューマーの優先度を指定する
一部のブローカー (特に Artemis) では、送信するメッセージのコンシューマー優先度を指定できます。次のサンプルでは、artemisConsumerPriority
プロパティーを使用して、優先度に基づいてメッセージを変換します。
<camelContext id="jms-basic-consumer-priority" xmlns="http://camel.apache.org/schema/spring" autoStartup="true"> <endpoint id="highPriorityQueue" uri="jms:queue:inputQueue?artemisConsumerPriority=1000"/> <endpoint id="mediumPriorityQueue" uri="jms:queue:inputQueue?artemisConsumerPriority=500"/> <endpoint id="lowPriorityQueue" uri="jms:queue:inputQueue?artemisConsumerPriority=1"/> <endpoint id="resultQueue" uri="jms:queue:outputQueue"/> <route> <from uri="ref:highPriorityQueue"/> <transform> <simple>High</simple> </transform> <to uri="ref:resultQueue"/> </route> <route> <from uri="ref:mediumPriorityQueue"/> <transform> <simple>Medium</simple> </transform> <to uri="ref:resultQueue"/> </route> <route> <from uri="ref:lowPriorityQueue"/> <transform> <simple>Low</simple> </transform> <to uri="ref:resultQueue"/> </route> </camelContext>