我正在尝试实现一个由多个 Web 服务调用组成的流程,由 Spring 集成读取的 JMS 消息启动。由于这些 WS 调用之间没有事务,因此我想跟踪我的流程已经进行了多远,以便在重试消息处理时跳过已执行的步骤。
示例步骤:
- 检索 A(获取 A.id)
- 为 A 创建新的 B(使用 A.id,获取 B.id)
- 为 B 创建新的 C(使用 B.id,获取 C.id)
现在,如果第 3 步中的第一次尝试失败,我已经创建了一个 B,并且知道它的 id。因此,如果我想重试该消息,它将跳过第二步,而不会留下不完整的 B。
那么,对于这个问题:是否可以在消息处理失败时使用附加 header 属性来装饰 Spring 集成读取的 JMS 消息?如果是这样,我该怎么做?
目前的工作方式:
- 消息已读
- 抛出一些异常
- 消息处理停止,ActiveMQ 将消息置于 DLQ
我希望它如何工作:
- 消息已读
- 抛出一些异常
- 异常已得到处理,处理结果是在原始消息中添加额外的 header 属性
- ActiveMQ 将消息放在 DLQ 上
可能实现这一目标的一件事如下:
- 阅读消息
- 开始处理,包裹在try-catch中
- 发生异常时,从异常中获取额外信息,根据原始消息创建一条新消息,将额外信息添加到 header 并将其直接发送到 DLQ
- 吞掉异常,以便原始消息消失
虽然这感觉有点hackish,但希望有一个更优雅的解决方案。
最佳答案
如果没有有关流程的更多信息,很难概括,但您可以考虑添加自定义请求处理程序建议来装饰和/或重新路由失败的消息。请参阅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?
啊...现在我想我知道你在问什么了;不,您不能“装饰”现有消息;您可以使用附加 header 重新发布它,而不是抛出异常。
您可以在建议或错误流中重新发布。
这对您来说可能看起来像“黑客”,但 JMS API 没有提供任何机制来执行您想要的操作。
关于java - Spring 集成 - 失败时装饰消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32696857/