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 Consuming 和 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 与 Dead Letter Channel 搭配使用,使用 JMS 队列作为死信队列,则通常会导致 Exception 存储在 JMS 消息中。但是,您可以使用 JMS 死信队列上的 transferExchange
选项指示 Camel 将整个交换存储在队列中,以存放 org.apache.camel.impl.DefaultExchangeHolder
的 javax.jms.ObjectMessage
。这可让您从死信队列使用,并通过密钥 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");
在这里,我们仅在转换中存储原始原因信息。但是,您可以使用任何表达式发送您喜欢的任何表达式。例如,您可以在 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>