Spring 集成 - 失败时修饰消息

Spring integration - decorate message on fail

我正在尝试实施一个由多个 webservice-calls 组成的流程,由 JMS-message 读取并由 Spring-integration 启动。由于这些 WS-calls 之间没有事务,我想跟踪我的流程进行了多远,以便在重试消息处理时跳过已经执行的步骤。

示例步骤:

  1. 检索A(得到A.id)
  2. 为 A 创建新的 B(使用 A.id,得到 B.id)
  3. 为 B 创建新的 C(使用 B.id,得到 C.id)

现在,如果第 3 步中的第一次尝试失败,我已经创建了一个 B,并且知道它的 ID。所以如果我想重试消息,它会跳过第二步,不会给我留下不完整的 B。

所以,对于这个问题:是否可以在消息处理失败时用额外的 header 属性装饰 Spring-integration 读取的 JMS-message?如果是这样,我该怎么做?

目前的工作方式:

  1. 消息已读
  2. 抛出一些异常
  3. 消息处理停止,ActiveMQ 将消息放在 DLQ

我希望它如何工作:

  1. 消息已读
  2. 抛出一些异常
  3. 异常已处理,此处理的结果是将额外的 header 属性 添加到原始消息中
  4. ActiveMQ 将消息放在 DLQ

可能实现此目标的一件事如下:

  1. 阅读邮件
  2. 开始处理,包裹在try-catch
  3. 异常时,从异常中获取额外信息,在原有消息的基础上创建新消息,将额外信息添加到header并直接发送到DLQ
  4. 吞下异常,使原始消息消失

不过感觉有点老套,希望有更优雅的解决方案。

来自spring forum:

To place new header to the MessageHeaders you should use MessageBuilder, because not only headers, but entire Message is immutable.

return MessageBuilder.fromMessage(message).setHeader(updateflag, message.getHeaders().get("Lgg_Rid") == "ACK" ? "CONF" : "FAIL").build();

在异步上下文中,错误将转到错误通道 - 您自己配置并在消息 headers 中用 errorChannel 指示的通道,或者如果 [=20= 则为全局错误通道] 被指定。详情见here.

如果没有关于您的流程的更多信息,很难一概而论,但您可以考虑添加自定义请求处理程序建议来修饰 and/or re-route 失败消息。参见 Adding Behavior to Endpoints

正如其他答案所说,您无法修改消息,但可以从中构建新消息。

编辑:

So, to the question: Is it possible to decorate a JMS-message read by Spring-integration with additional header properties upon message processing failures? If so, how could I do this?

啊……现在我想我知道你在问什么了;不,您不能 "decorate" 现有消息;您可以使用额外的 headers 重新发布它,而不是抛出异常。

您可以在建议或错误流程中重新发布。

对您来说它可能看起来像 "hack",但 JMS API 没有提供执行您想要的操作的机制。