【问题标题】:Will this Camel Route acknowledge message in exception scenario?这条骆驼路线会在异常情况下确认消息吗?
【发布时间】:2019-08-16 17:10:23
【问题描述】:

我有一个将 JSON 转换为对象并将其传递给处理器类的 Camel 路由。代码如下。此 ActiveMQ 使用者未确认某些消息,从而导致主题得到备份。代码没有显式设置确认模式,但断点显示这些值 -

确认模式 = -1 确认模式名称 = null

应进行哪些更改以确保在成功处理和处理器类内部发生异常时发送确认?

@Component
public class MyRoute extends RouteBuilder {

    private String mySubscription;

    private MyProcessor myProcessor;

    public MyRoute(@Value("${my.topic}") String tripSubscription, MyProcessor myProcessor) {
        this.mySubscription = mySubscription;
        this.myProcessor = myProcessor;
    }

    @Override
    public void configure() {
        from(mySubscription)
                .unmarshal().json(JsonLibrary.Jackson, MyDTO.class)
                .bean(myProcessor, "process(${body})")
                .end();
    }
}

处理器类 -

@Slf4j
@Component
@AllArgsConstructor
public class MyProcessor {

    public void process(MyDTO dto) {

        //code that throws exception

    }

}

【问题讨论】:

  • camel-jms 应该默认使用 AUTO ack 模式,并且消息在收到时尽快被 ACK(不是事务语义)。您使用的是什么版本的 Camel 和 ActiveMQ?
  • 在代码中,Camel 版本是 2.19.5,ActiveMQ 版本是 5.15.8(虽然我连接的 broker 显示的是 5.15.2)

标签: apache-camel activemq jms-topic


【解决方案1】:

骆驼JMS component docs at Github 表示默认确认模式是AUTO_ ACKNOWLEDGE

但是,较旧的docs at camel.apache.org 表示默认值为-1 与您看到的值相对应。要么是在最近的版本中更改了默认值,要么是 Github 上的新文档有误。

-1 的值在某种程度上无效,因为它不是 the defined modes

因此,您可以尝试在您的消费者上显式设置acknowledgementModeName=AUTO_ACKNOWLEDGE

【讨论】:

    【解决方案2】:

    旁注...看起来您没有将“tripSubscription”设置为实例变量,如果这是您的意图...

    【讨论】:

      猜你喜欢
      • 2020-05-13
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多