52.6. Samples
JMS 也用于其他组件的许多示例。但我们提供了几个示例以开始。
52.6.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");
52.6.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");
52.6.3. 使用注解 复制链接链接已复制到粘贴板!
Camel 还具有注解,因此您可以使用 POJO Consuming 和 POJO Producing。
52.6.4. Spring DSL 示例 复制链接链接已复制到粘贴板!
前面的示例使用 Java DSL。Camel 还支持 Spring XML DSL。以下是使用 Spring DSL 的大成本示例:
52.6.5. 其他示例 复制链接链接已复制到粘贴板!
JMS 会出现在其他组件和 EIP 模式的许多示例中,以及此 Camel 文档。因此可以自由浏览文档。
52.6.6. 使用 JMS 作为死信队列存储交换 复制链接链接已复制到粘贴板!
通常,当将 JMS 用作传输时,它只传输正文和标头作为载荷。如果要将 JMS 与死信 频道 搭配使用,请将 JMS 队列用作 Dead Letter Queue,通常原因的 Exception 不在 JMS 消息中。但是,您可以使用 JMS 死信队列上的 transferExchange 选项指示 Camel 将整个交换存储在队列中,以存放 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 队列并分析问题:
52.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");
// 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 上调用方法或使用自定义处理器。