You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Camel异常处理路由:failureRoute调用MQ失败如何实现至少3次重试?

Apache Camel 给failureRoute添加重试机制

针对你的需求,要在failureRoute发送MQ失败时执行至少3次重试,可以通过两种常用方式实现,以下是具体代码修改和说明:

方式一:使用retry() DSL(推荐,更直观)

直接在failureRoute中对MQ发送步骤配置重试规则,仅针对后续处理器的异常触发重试:

onException(Exception.class)
    .useOriginalMessage()
    .handled(true)
    .log(LoggingLevel.ERROR, "Exception --> ${exception.stacktrace}")
    .to("direct:failureRoute");

from("direct:failureRoute")
    .transacted()
    .routeId("failure-route")
    // 配置重试逻辑:最多重试3次,针对JMS连接/发送异常,每次间隔1秒
    .retry(3)
        .onException(JMSException.class, ConnectException.class)
        .delay(1000)
        .log(LoggingLevel.WARN, "发送失败,正在重试第 ${exchangeProperty.CamelRetriesCounter} 次")
    .end()
    .to("wmqJmsTemplate:{{mq.failure.queue}}?preserveMessageQos=true");

方式二:使用路由级onException配置

给failureRoute单独配置异常处理器,捕获MQ相关异常后执行重试:

onException(Exception.class)
    .useOriginalMessage()
    .handled(true)
    .log(LoggingLevel.ERROR, "Exception --> ${exception.stacktrace}")
    .to("direct:failureRoute");

from("direct:failureRoute")
    .transacted()
    .routeId("failure-route")
    // 针对MQ相关异常设置重试规则
    .onException(JMSException.class, ConnectException.class)
        .maximumRedeliveries(3) // 最大重试次数(含首次发送,总共4次尝试)
        .redeliveryDelay(1000) // 重试间隔1秒
        .log(LoggingLevel.WARN, "发送失败,正在重试第 ${exceptionProperty.CamelRedeliveryCounter} 次")
        .handled(false) // 重试耗尽后抛出异常,可根据需求改为true自行处理
    .end()
    .to("wmqJmsTemplate:{{mq.failure.queue}}?preserveMessageQos=true");

关键配置说明

  • 异常类型限制:尽量指定具体异常(如JMSException、ConnectException),避免无关异常触发重试,减少不必要的资源消耗。
  • 重试间隔:通过delay或redeliveryDelay设置间隔,避免短时间高频重试导致MQ服务压力过大。
  • 事务配合:因为failureRoute启用了transacted(),每次重试前事务会自动回滚,保证数据一致性。
  • 重试日志:添加重试日志便于排查问题,通过${exchangeProperty.CamelRetriesCounter}或${exceptionProperty.CamelRedeliveryCounter}获取当前重试次数。

重试耗尽后的处理(可选)

如果3次重试后仍然失败,可添加额外逻辑处理,比如写入死信数据库:

// 在failureRoute的onException中补充
.onException(JMSException.class, ConnectException.class)
    .maximumRedeliveries(3)
    .redeliveryDelay(1000)
    .log(LoggingLevel.WARN, "发送失败,正在重试第 ${exceptionProperty.CamelRedeliveryCounter} 次")
    .onRedelivery(exchange -> {
        // 重试前的自定义逻辑,比如记录重试详情
        log.warn("准备第 {} 次重试,异常信息:{}", 
            exchange.getProperty(Exchange.REDELIVERY_COUNTER),
            exchange.getProperty(Exchange.EXCEPTION_CAUGHT));
    })
    .handled(true)
    // 重试耗尽后写入数据库
    .to("jdbc:dataSource?sql=INSERT INTO failed_messages (content, error_msg, create_time) VALUES (?, ?, NOW())")
.end()

内容的提问来源于stack exchange,提问作者VKR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:50:15