179.6. Samples
JMS 也用于其他组件。但我们提供了几个示例来开始。
179.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");
179.6.2. 发送到 JMS
在以下示例中,我们轮询文件文件夹,并将文件内容发送到 JMS 主题。我们希望文件的内容作为 TextMessage
而不是 BytesMessage
,因此我们需要将正文转换为 String
:
from("file://orders"). convertBodyTo(String.class). to("jms:topic:OrdersTopic");
179.6.3. 使用注解
Camel 还具有注解,因此您可以使用 POJO 消耗和 POJO Producing。
179.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>
179.6.5. 其他示例
JMS 出现在其他组件和 EIP 模式的许多示例中,以及 Camel 文档。因此请随时浏览文档。
179.6.6. 使用 JMS 作为死信队列存储交换
通常,当将 JMS 用作传输时,它只传输正文和标头作为载荷。如果要将 JMS 与死信 频道 搭配使用,请将 JMS 队列用作 Dead Letter Queue,通常原因的 Exception 不在 JMS 消息中。但是,您可以对 JMS 死信队列使用 transferExchange
选项,以指示 Camel 将整个 Exchange 存储在队列中,作为 javax.jms.ObjectMessage
,其中包含 org.apache.camel.impl.DefaultExchangeHolder
。这样,您可以从死信队列使用,并使用密钥 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();
179.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");
在这里,我们在转换中仅存储原始原因错误消息。但是,您可以使用任何 Expression 来发送您喜欢的任何对象。例如,您可以在 Bean 上调用方法或使用自定义处理器。
179.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>