【问题标题】:Transactional Camel JMS Consumer事务骆驼 JMS 消费者
【发布时间】:2013-05-23 02:21:25
【问题描述】:

我有一条用于从 JMS 队列中读取项目并将它们写入数据库的路由。

我已经阅读了有关 Apache Camel JMS 组件的文档,但我没有得到我的问题的准确和明确的答案,即“如果出现异常,JMS 消费者是否重新插入项目或解锁 JMS 队列中的消息发生在路线中?”。

谢谢

阿里

【问题讨论】:

    标签: xml jms apache-camel spring-transactions


    【解决方案1】:

    您可以在此处阅读有关交易的信息:http://camel.apache.org/transactional-client.html

    事务模式下的 JMS 消费者会将消息保留在队列中,直到提交 TX。

    如果 TX 进行回滚,则 JMS 代理将再次重新传递消息。您可以将 JMS 代理配置为执行此 X 次,如果仍然失败,则将消息移动到死信队列。

    这是特定于 JMS 代理的开箱即用配置等。有关 Apache ActiveMQ 的详细信息,请参阅:http://activemq.apache.org/message-redelivery-and-dlq-handling.html

    如果您有一本 Camel in Action 这本书,那么第 9 章会详细介绍这一点。图 9.6 说明了所有这些是如何工作的。

    【讨论】:

      【解决方案2】:

      正如其他答案中所提到的,有几件事要记住:

      1. Camel 仅向 Spring 提供 javax.jms.MessageListener impl。它的 Spring 的 DMLC (DefaultMessageListenerContainer) 和相关类正在完成所有繁重的工作。

      2. Camel 路由的定义实际上注册了一个侦听器实例,稍后当 DMLC 将从 JMS 代理接收到消息时,Spring 将在 try-catch 块中调用该实例。这意味着您的消费者路由总是在 Spring 控制的上下文中调用。

      3. 如果路由中有未处理的错误,Spring 将捕获它们并“回滚”。如果路由成功完成,Spring 将“commit” JMS 消息,这意味着 msg 将从代理队列中删除。

      如果您想详细了解下面发生的事情,请阅读这篇文章:http://krasnikov-tube.blogspot.sg/2014/02/where-apache-camel-meets-spring-jms.html

      希望这会有所帮助。

      【讨论】:

      • 请注意,不鼓励link-only answers,所以答案应该是搜索解决方案的终点(与另一个参考文献的中途停留相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
      【解决方案3】:

      这还取决于您如何配置路线。为了让消息返回到您的队列,您需要将组件配置为事务性的。路由中的异常处理需要让异常冒泡,如果将“handled”设置为true,则异常不会冒泡,您将丢失消息。

      【讨论】:

      • 如果配置了 DLQ 并且您让异常冒泡,消息将转到您的 DLQ。
      猜你喜欢
      • 2013-06-03
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-30
      相关资源
      最近更新 更多