【问题标题】:Camel with JMS Transaction and REST post call带有 JMS 事务和 REST 后调用的骆驼
【发布时间】:2018-11-20 10:58:41
【问题描述】:

我需要从队列中读取消息并调用 REST 服务进行发布。

然后,我在看Camel的JMS事务,看起来你可以设置一个maximumRedeliveries来再次处理队列消息,所以在失败的情况下回滚事务,我想知道它是如何工作的如果在同一条骆驼路线中,我们必须调用 REST 服务来发布内容,那么该部分如何回滚??

maxDelivery 配置:

errorHandler(new TransactionErrorHandlerBuilder()
        .loggingLevel(LoggingLevel.ERROR)
        .useOriginalMessage()
        .maximumRedeliveries(2)
        .logHandled(false)
        .logExhausted(true)
    );

路线的伪代码:

//Reading message from the queue
from("activemq:AMQ.App.EMC2.In.PMQueue?jmsMessageType=Bytes").
    transacted().
    unmarshal(jaxbDataFormat).bean(pmMessageEnricher).
    to("direct:start-post");

//Then doing the post
from("direct:start-post").
    setHeader(Exchange.HTTP_METHOD, constant("POST")).
    setHeader(Exchange.CONTENT_TYPE, constant("application/json")).
    setBody(constant(pmMessageEnricher.toJson())).
    to("http://xxx").
    to("direct:start-somethingelse");

//Then doing something else
from("direct:start-somethingelse").
blabla...

假设start-somethingelse 发生异常,如何回滚 REST 后调用?因为我们以无状态方式调用外部服务。

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:

    你的怀疑是正确的。在 JMS 事务回滚的情况下,POST 请求无法回滚,因为服务提供者不是 JMS 事务的一部分。该事务仅在 JMS 代理和 Camel JMS 使用者之间进行(另请参见 Camel transactional client)。

    但是,如果您发现处理错误,您可以应用所需的补偿逻辑。例如用另一个请求删除已经发布的数据。

    顺便说一句:不要混淆骆驼重新交付和经纪人重新交付!

    骆驼重新交付由Camel Errorhandler(不是经纪人)完成。在您的示例中,它最多执行 2 次重新交付。但请注意,骆驼重新交付不会重新处理整个路线,而只是重新处理发生故障的处理器

    因此,如果 to("http://xxx") 失败并且 Camel Errorhandler 重新发送,Camel 仅重试 to("http://xxx")

    相比之下,如果你的 JMS 事务被回滚,代理会重新将消息传递给 Camel,并再次处理整个路由

    注意不要用 Camel 错误处理程序“掩盖”JMS 重新传递。

    【讨论】:

    • 这里有很多细节。您也可以考虑在transactional clients 和/或error handlers 上链接官方文档
    • 感谢提示,已添加链接
    • 我发现了有关重新交付的其他信息(来自这个非常有用的链接):“事务模式下的重新交付不是由 Camel 处理,而是由支持系统(事务管理器)处理。在这种情况下,您应该求助于后备系统如何配置重新交付”意味着如果我有一个使用 activeMq 设置的事务管理器,并且如果我设置了与 .transacted() 关联的路由和子路由,则 .maximumRedeliveries(2) 毫无意义,重新交付最大计数来自 activemq 代理
    猜你喜欢
    • 2014-02-13
    • 2013-05-23
    • 1970-01-01
    • 2013-04-19
    • 2016-10-30
    • 2012-11-10
    • 2014-04-26
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多