我有一条路径,用于从JMS队列中读取项目并将它们写入DB。
我已经阅读了有关Apache Camel JMS组件的文档,但我没有得到我的问题的确切和明确的答案,即“如果某个例外,JMS使用者是否重新插入项目或解锁JMS队列中的消息”发生在路线上?“。
由于
阿里
答案 0 :(得分:2)
您可以在此处阅读有关交易的信息: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说明了所有这些的工作原理。
答案 1 :(得分:2)
正如其他答案中所提到的,有几件事要记住:
Camel只向Spring提供了一个javax.jms.MessageListener impl。它的Spring的DMLC(DefaultMessageListenerContainer)和相关的类正在做所有繁重的工作。
Camel路由的定义实际上会注册一个侦听器实例,稍后当Spring将从JMS代理接收到一个msg时,Spring将在try-catch块中调用该实例。这意味着您的消费者路由始终在Spring控制的上下文中调用。
如果路由中存在未处理的错误,Spring会捕获它们并将“回滚”。如果路由成功完成,Spring将“提交”JMS消息,这意味着将从代理队列中删除msg。
如果您想详细了解下面发生的事情,请阅读以下文章:http://krasnikov-tube.blogspot.sg/2014/02/where-apache-camel-meets-spring-jms.html
希望这会有所帮助。
答案 2 :(得分:0)
这还取决于您如何配置路线。要使消息返回到您的队列,您需要将组件配置为事务性的。路线中的异常处理需要让异常冒泡,如果你设置"处理"如果异常不会冒泡,你就会失去信息。