Spring 集成 - 失败时修饰消息
Spring integration - decorate message on fail
我正在尝试实施一个由多个 webservice-calls 组成的流程,由 JMS-message 读取并由 Spring-integration 启动。由于这些 WS-calls 之间没有事务,我想跟踪我的流程进行了多远,以便在重试消息处理时跳过已经执行的步骤。
示例步骤:
- 检索A(得到A.id)
- 为 A 创建新的 B(使用 A.id,得到 B.id)
- 为 B 创建新的 C(使用 B.id,得到 C.id)
现在,如果第 3 步中的第一次尝试失败,我已经创建了一个 B,并且知道它的 ID。所以如果我想重试消息,它会跳过第二步,不会给我留下不完整的 B。
所以,对于这个问题:是否可以在消息处理失败时用额外的 header 属性装饰 Spring-integration 读取的 JMS-message?如果是这样,我该怎么做?
目前的工作方式:
- 消息已读
- 抛出一些异常
- 消息处理停止,ActiveMQ 将消息放在 DLQ
我希望它如何工作:
- 消息已读
- 抛出一些异常
- 异常已处理,此处理的结果是将额外的 header 属性 添加到原始消息中
- ActiveMQ 将消息放在 DLQ
可能实现此目标的一件事如下:
- 阅读邮件
- 开始处理,包裹在try-catch
- 异常时,从异常中获取额外信息,在原有消息的基础上创建新消息,将额外信息添加到header并直接发送到DLQ
- 吞下异常,使原始消息消失
不过感觉有点老套,希望有更优雅的解决方案。
来自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 没有提供执行您想要的操作的机制。
我正在尝试实施一个由多个 webservice-calls 组成的流程,由 JMS-message 读取并由 Spring-integration 启动。由于这些 WS-calls 之间没有事务,我想跟踪我的流程进行了多远,以便在重试消息处理时跳过已经执行的步骤。
示例步骤:
- 检索A(得到A.id)
- 为 A 创建新的 B(使用 A.id,得到 B.id)
- 为 B 创建新的 C(使用 B.id,得到 C.id)
现在,如果第 3 步中的第一次尝试失败,我已经创建了一个 B,并且知道它的 ID。所以如果我想重试消息,它会跳过第二步,不会给我留下不完整的 B。
所以,对于这个问题:是否可以在消息处理失败时用额外的 header 属性装饰 Spring-integration 读取的 JMS-message?如果是这样,我该怎么做?
目前的工作方式:
- 消息已读
- 抛出一些异常
- 消息处理停止,ActiveMQ 将消息放在 DLQ
我希望它如何工作:
- 消息已读
- 抛出一些异常
- 异常已处理,此处理的结果是将额外的 header 属性 添加到原始消息中
- ActiveMQ 将消息放在 DLQ
可能实现此目标的一件事如下:
- 阅读邮件
- 开始处理,包裹在try-catch
- 异常时,从异常中获取额外信息,在原有消息的基础上创建新消息,将额外信息添加到header并直接发送到DLQ
- 吞下异常,使原始消息消失
不过感觉有点老套,希望有更优雅的解决方案。
来自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 没有提供执行您想要的操作的机制。