Java Spring集成-失败时装饰消息

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 因此,

我试图实现一个由几个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

    因此,问题是:在消息处理失败时,是否可以用附加的头属性来修饰Spring集成读取的JMS消息?如果是,我该怎么做

    目前的工作方式:

  • 消息已被读取
  • 引发了一些异常
  • 消息处理停止,ActiveMQ将消息放在DLQ上
  • 我希望它如何工作:

  • 消息已被读取
  • 引发了一些异常
  • 异常被处理,处理的结果是在原始消息中添加一个额外的头属性
  • ActiveMQ将消息放在DLQ上
  • 可能实现这一目标的一件事是:

  • 读留言
  • 开始处理,包装在try-catch中
  • 在异常中,从异常中获取额外信息,在原始消息的基础上创建新消息,将额外信息添加到头并直接发送到DLQ
  • 接受异常,以便显示原始消息
  • 不过这感觉有点骇人,希望有一个更优雅的解决方案。

    来自春季:

    要将新标题放置到MessageHeaders,您应该使用 MessageBuilder,因为不仅是头,而且整个消息都是 不变的


    在异步上下文中,错误将转到错误通道-您自己配置并在消息标题中用
    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();