Camel消费单个消息并停止,交易

时间:2015-05-15 10:58:19

标签: java transactions apache-camel consumer

我正在尝试使用Camel以事务方式从JMS队列中使用单个消息。特别是在这样的流程中:

  1. 等到JMS队列上发布消息
  2. 尝试使用和处理单个消息
  3. 如果处理失败(发生异常),则回滚消耗
  4. 如果处理过去,确认并停止消费,
  5. 稍后在应用程序生命周期中,另一个进程触发消耗从(1)
  6. 重新开始

    起初我尝试使用使用ConsumerTemplate的轮询使用者来做这件事,但是我无法弄清楚它是否有可能以事务方式执行此操作 - 看起来事务是ConsumerTemplate内部的,所以无论我做什么在ConsumerTemplate返回时,消息已被确认为已消耗。

    我可以使用ConsumerTemplate吗?我可以使用Camel执行此操作吗?如果是,那么最佳方法是什么(简单示例将被赞赏)?

1 个答案:

答案 0 :(得分:0)

我最终使用pollEnrich dsl来实现这一目标。例如,我的路线构建器看起来像:

from("direct:service-endpont").transacted("PROPOGATION_REQUIRED").setExchangePattern(ExchangePattern.InOut).pollEnrich("activemq:test-queue").bean(myHandler);

我使用直接端点作为服务,向直接端点发送“请求”消息,轮询jms队列以获取单个消息(如果需要,则阻塞)。事务开始扩展到pollEnrich,因此,例如,如果myHandler bean失败,则pollEnrich期间获取的消息不会被消耗并留在队列中。