Java 带有JMS事务和REST post调用的Camel

Java 带有JMS事务和REST post调用的Camel,java,apache-camel,Java,Apache Camel,我需要从队列中读取一条消息,并调用REST服务进行发布 然后,我用Camel查看JMS事务,它看起来可以设置一个maximumRedeliveries来再次处理队列消息,因此在出现故障时回滚事务,我想知道如果在同一个Camel路由中,我们必须调用REST服务来发布某些内容,它如何工作,如何将该部分回滚 maxDelivery配置: errorHandler(new TransactionErrorHandlerBuilder() .loggingLevel(LoggingLeve

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

然后,我用Camel查看JMS事务,它看起来可以设置一个
maximumRedeliveries
来再次处理队列消息,因此在出现故障时回滚事务,我想知道如果在同一个Camel路由中,我们必须调用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...

假设在
启动somethingelse
中发生异常,如何回滚其余post调用?因为我们以无状态的方式调用外部服务。

您的疑问是正确的。在JMS事务回滚的情况下,POST请求无法回滚,因为服务提供者不是JMS事务的一部分。事务仅在JMS代理和驼峰JMS消费者之间(另请参见)

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

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

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

所以如果
到(“http://xxx“”
失败,并且驼峰错误处理程序执行重新交付,驼峰仅重试
到(“”http://xxx)

相反,如果您的JMS事务被回滚,则代理将消息重新传递给Camel,并再次处理整个路由


注意不要用驼峰错误处理程序“掩盖”JMS重新交付。

您的疑问是正确的。在JMS事务回滚的情况下,POST请求无法回滚,因为服务提供者不是JMS事务的一部分。事务仅在JMS代理和驼峰JMS消费者之间(另请参见)

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

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

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

所以如果
到(“http://xxx“”
失败,并且驼峰错误处理程序执行重新交付,驼峰仅重试
到(“”http://xxx)

相反,如果您的JMS事务被回滚,则代理将消息重新传递给Camel,并再次处理整个路由


注意不要用Camel Errorhandler“屏蔽”JMS重新交付。

这里有大量详细信息。您还可以考虑将官方文档链接到和/或感谢提示,我补充说,林克西找到了关于重发的其他信息(来自这个非常有用的链接):“交易模式中的重发不是由骆驼处理的,而是由后备系统(事务管理器)处理的。。在这种情况下,您应该求助于支持系统“如何配置重新交付”,这意味着如果我使用activeMq设置了事务管理器,并且如果我设置了与.Transact()关联的路由和子路由,.maximumRedeliveries(2)是无意义的,重新交付的最大计数来自activeMq Brokerg这里有大量的详细信息。您还可以考虑将官方文档链接到和/或感谢提示,我补充说,林克西找到了关于重发的其他信息(来自这个非常有用的链接):“交易模式中的重发不是由骆驼处理的,而是由后备系统(事务管理器)处理的。。在这种情况下,您应该求助于支持系统“如何配置重新交付”,这意味着如果我使用activeMq设置了事务管理器,并且如果我设置了与.Transact()关联的路由和子路由,.maximumRedeliveries(2)是无意义的,重新交付的最大计数来自activeMq代理