Java Spring集成-失败时装饰消息
我试图实现一个由几个webservice调用组成的流程,由Spring integration读取的JMS消息启动。由于这些WS-Call之间没有事务,所以我希望跟踪我的流程已经走了多远,以便在重试消息处理时跳过已经执行的步骤 示例步骤:Java Spring集成-失败时装饰消息,java,spring,jms,activemq,spring-integration,Java,Spring,Jms,Activemq,Spring Integration,我试图实现一个由几个webservice调用组成的流程,由Spring integration读取的JMS消息启动。由于这些WS-Call之间没有事务,所以我希望跟踪我的流程已经走了多远,以便在重试消息处理时跳过已经执行的步骤 示例步骤: 检索A(获取A.id) 为A创建新B(使用A.id,获取B.id) 为B创建新的C(使用B.id,获取C.id) 现在,如果第一次尝试在步骤3中失败,我已经创建了一个B,并且知道它的id。因此,如果我想重试消息,它将跳过第二步,而不会留下一个不完整的B 因此,
在异步上下文中,错误将转到错误通道-您自己配置并在消息标题中用
errorChannel
指示的错误通道,或者如果未指定,则转到全局错误通道。请参阅更详细的信息。 < P>很难在没有更多关于流的信息的情况下泛化,但您可以考虑添加自定义请求处理程序建议来装饰和/或重新路由失败的消息。看
正如另一个答案所说,您不能修改消息,但可以从中构建新消息
编辑:
因此,问题是:在消息处理失败时,是否可以用附加的头属性来修饰Spring集成读取的JMS消息?如果是,我该怎么做
啊。。。现在我想我知道你在问什么了;不,你不能“装饰”现有的信息;您可以使用其他标题重新发布它,而不是引发异常
您可以在通知或错误流中重新发布
对您来说,这似乎是一种“黑客行为”,但JMS API并没有提供任何机制来执行您想要的操作。在某个问题上出现了一个错误,我甚至不知道这是否是解决实际问题的正确方法。我使用了该指南来创建错误处理程序,但实际上我并不认为这是正确的方法,因为它不是原始消息。我使用的是ActiveMQ,通过默认的错误处理,相关消息被放置在DLQ上。我想改变的是这条信息,而不是中间的错误信息。我正在考虑删除我问题中的“我尝试了什么”部分,因为人们似乎被它所吸引。它只是根据“你尝试过什么”——SO的要求添加的。而且,我不认为我会这样做。无论如何,我认为向端点添加行为不会解决问题。我将用更多的细节更新我的问题。最终捕获了所有异常,然后在异常时使用附加的标题重新创建消息,然后将其直接放在DLQ上。没有我想要的那么漂亮,但很管用。
return MessageBuilder.fromMessage(message).setHeader(updateflag, message.getHeaders().get("Lgg_Rid") == "ACK" ? "CONF" : "FAIL").build();