搜索

179.20. Samples

download PDF

JMS 也用于其他组件。但我们提供了几个示例来开始。

179.20.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.20.2. 发送到 JMS

在以下示例中,我们轮询文件文件夹,并将文件内容发送到 JMS 主题。我们希望文件的内容作为 TextMessage 而不是 BytesMessage,因此我们需要将正文转换为 String

from("file://orders").
  convertBodyTo(String.class).
  to("jms:topic:OrdersTopic");

179.20.3. 使用注解

Camel 还具有注解,因此您可以使用 POJO 消耗和 POJO Producing。

179.20.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.20.5. 其他示例

JMS 出现在其他组件和 EIP 模式的许多示例中,以及 Camel 文档。因此请随时浏览文档。如果您有时间,请查看本教程,该教程使用 JMS,但侧重于 Spring Remoting 和 Camel 如何一起工作 Tutorial-JmsRemoting。

179.20.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.20.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 上调用方法或使用自定义处理器。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.