java - Camel 消耗单个消息并停止,进行事务处理

标签 java transactions apache-camel consumer

我正在尝试使用 Camel 以事务处理方式使用 JMS 队列中的单个消息。具体来说,流程如下:

  1. 等待消息在 JMS 队列上发布
  2. 尝试使用并处理单个消息
  3. 如果处理失败(发生异常),则回滚消费
  4. 如果处理通过,则确认并停止使用更多消息
  5. 在应用程序生命周期的后期,另一个进程会触发消费,从 (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/

相关文章:

java - 如何从 SFSB 的 SessionContext 获取业务对象

java - 如何防止为成员变量创建重复的方法?

java - ESB 与服务

java - 接收 Camel Twitter 消费者端点数据

java - 测试字段注入(inject) VS 构造函数注入(inject)

java - 在 Java 中,当方法具有基类作为参数时,使用反射调用方法无法找到方法

java - 通过在服务器上使用 java 程序限制来自 java 客户端的 postges 访问

sql - REPEATABLE_READ 隔离是否会阻止非范围查询的插入?

java - java中涉及jdbc、jms、webservices的分布式事务如何实现

java - Camel 休息路线在异常时不返回状态码