我正在尝试使用 Camel 以事务处理方式使用 JMS 队列中的单个消息。具体来说,流程如下:
- 等待消息在 JMS 队列上发布
- 尝试使用并处理单个消息
- 如果处理失败(发生异常),则回滚消费
- 如果处理通过,则确认并停止使用更多消息
- 在应用程序生命周期的后期,另一个进程会触发消费,从 (1) 重新开始
起初,我尝试使用轮询消费者、使用 ConsumerTemplate 来执行此操作,但我无法弄清楚是否可以通过事务方式执行此操作 - 似乎事务是 ConsumerTemplate 内部的,所以无论我做什么当 ConsumerTemplate 返回时,该消息已被确认为已使用。
我可以使用 ConsumerTemplate 来执行此操作吗?我可以使用 Camel 来做到这一点吗?如果可以的话,最好的方法是什么(简单的例子将不胜感激)?
最佳答案
我最终使用 pollEnrich dsl 来实现这一目标。例如,我的路线构建器如下所示:
from("direct:service-endpont").transacted("PROPOGATION_REQUIRED").setExchangePattern(ExchangePattern.InOut).pollEnrich("activemq:test-queue").bean(myHandler);
我使用直接端点作为服务,向直接端点发送“请求”消息,轮询 jms 队列中的单个消息(如果需要,则阻塞)。启动的事务扩展到 pollEnrich,因此,例如,如果 myHandler bean 失败,则在 pollEnrich 期间获取的消息不会被消耗并保留在队列中。
关于java - Camel 消耗单个消息并停止,进行事务处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30257802/