26.5. Samples
JMS 也用于其他组件的很多示例。但是,我们提供以下几个示例以开始。
26.5.1. 从 JMS 接收 复制链接链接已复制到粘贴板!
在以下示例中,我们配置接收 JMS 消息的路由,并将消息路由到 POJO:
from("jms:queue:foo"). to("bean:myBusinessLogic");
from("jms:queue:foo").
to("bean:myBusinessLogic");
您可以使用任何 EIP 模式,以便路由可以基于上下文。例如,如何过滤大开支的订购主题:
from("jms:topic:OrdersTopic"). filter().method("myBean", "isGoldCustomer"). to("jms:queue:BigSpendersQueue");
from("jms:topic:OrdersTopic").
filter().method("myBean", "isGoldCustomer").
to("jms:queue:BigSpendersQueue");
26.5.2. 发送到 JMS 复制链接链接已复制到粘贴板!
在以下示例中,我们轮询文件文件夹并将文件内容发送到 JMS 主题。由于我们希望文件的内容为 TextMessage
而不是 BytesMessage
,因此我们需要将正文转换为 String
:
from("file://orders"). convertBodyTo(String.class). to("jms:topic:OrdersTopic");
from("file://orders").
convertBodyTo(String.class).
to("jms:topic:OrdersTopic");
26.5.3. 使用注解 复制链接链接已复制到粘贴板!
Camel 还具有注释,因此您可以使用 POJO Consuming 和 POJO Producing。
26.5.4. Spring DSL 示例 复制链接链接已复制到粘贴板!
前面的示例使用 Java DSL。Camel 还支持 Spring XML DSL。以下是使用 Spring DSL 的大量成本示例:
26.5.5. 其他示例 复制链接链接已复制到粘贴板!
JMS 出现在许多用于其他组件和 EIP 模式的示例,以及 Camel 文档。因此,您可以自由浏览文档。
26.5.6. 使用 JMS 作为死信队列存储交换 复制链接链接已复制到粘贴板!
通常,当使用 JMS 作为传输时,它只会将正文和标头作为载荷传输。如果要将 JMS 与 Dead Letter Channel 搭配使用,请将 JMS 队列用作 Dead Letter Queue,则通常导致的 Exception 不会存储在 JMS 消息中。但是,您可以使用 JMS 死信队列上的 transferExchange
选项指示 Camel 将整个 Exchange 存储在队列中,作为包含 org.apache.camel.support.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"));
// setup error handler to use JMS as queue and store the entire Exchange
errorHandler(deadLetterChannel("jms:queue:dead?transferExchange=true"));
然后,您可以使用 JMS 队列并分析问题:
26.5.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");
// 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 上调用方法或使用自定义处理器。