我有一条用于从 JMS 队列中读取项目并将它们写入数据库的路线。
我已经阅读了有关 Apache Camel JMS 组件的文档,但我没有得到我的问题的准确和明确的答案,即“如果出现异常,JMS 消费者是否重新插入项目或解锁 JMS 队列中的消息?路线?”。
谢谢
阿里
我有一条用于从 JMS 队列中读取项目并将它们写入数据库的路线。
我已经阅读了有关 Apache Camel JMS 组件的文档,但我没有得到我的问题的准确和明确的答案,即“如果出现异常,JMS 消费者是否重新插入项目或解锁 JMS 队列中的消息?路线?”。
谢谢
阿里
您可以在此处阅读有关交易的信息:http: //camel.apache.org/transactional-client.html
事务模式下的 JMS 消费者会将消息保留在队列中,直到提交 TX。
如果 TX 进行回滚,则 JMS Broker 将再次重新传递消息。您可以将 JMS 代理配置为执行此 X 次,如果仍然失败,则将消息移动到死信队列。
这是特定于 JMS 代理的开箱即用配置等。对于 Apache ActiveMQ,请参阅以下位置的详细信息: http: //activemq.apache.org/message-redelivery-and-dlq-handling.html
如果你有一本 Camel in Action 这本书,那么第 9 章会详细介绍这本书。图 9.6 说明了所有这些是如何工作的。
正如其他答案中所提到的,有几件事要记住:
Camel 只为 Spring 提供了一个 javax.jms.MessageListener impl。它的 Spring 的 DMLC (DefaultMessageListenerContainer) 和相关类正在完成所有繁重的工作。
Camel 路由的定义实际上注册了一个侦听器实例,该实例将在稍后 DMLC 将从 JMS 代理接收到消息时由 Spring 在 try-catch 块中调用。这意味着您的消费者路由总是在 Spring 控制的上下文中调用。
如果路由中有未处理的错误,Spring 将捕获它们并“回滚”。如果路由成功完成,Spring 将“提交” JMS 消息,这意味着 msg 将从代理队列中删除。
如果您想详细了解下面发生的事情,请阅读这篇文章: http: //krasnikov-tube.blogspot.sg/2014/02/where-apache-camel-meets-spring-jms.html
希望这会有所帮助。
这还取决于您如何配置路线。要将消息返回到您的队列,您需要将组件配置为事务性的。您的路由中的异常处理需要让异常冒泡,如果您将“已处理”设置为 true,则异常不会冒泡并且您将丢失消息。