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

标签 java spring jms activemq spring-integration

我正在尝试实现一个由多个 Web 服务调用组成的流程,由 Spring 集成读取的 JMS 消息启动。由于这些 WS 调用之间没有事务,因此我想跟踪我的流程已经进行了多远,以便在重试消息处理时跳过已执行的步骤。

示例步骤:

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

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

那么,对于这个问题:是否可以在消息处理失败时使用附加 header 属性来装饰 Spring 集成读取的 JMS 消息?如果是这样,我该怎么做?

目前的工作方式:

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

我希望它如何工作:

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

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

  1. 阅读消息
  2. 开始处理,包裹在try-catch中
  3. 发生异常时,从异常中获取额外信息,根据原始消息创建一条新消息,将额外信息添加到 header 并将其直接发送到 DLQ
  4. 吞掉异常,以便原始消息消失

虽然这感觉有点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/

相关文章:

java - 2019-06-17T20 :27:23. 706000000Z 的日期格式是什么?

java - 如何使用 spring boot 将 json 映射到对象

java - java中使用系统调用捕获屏幕的代码

java - 将消息保留在队列中以防接收器崩溃

servlets - 在 servlet 中注入(inject) jms 资源以及 MDB 的最佳实践

java - 使用 XASession 时消息未从 JMS 队列中删除

java - 通过 Java 向 POM.xml 文件添加注释

java - spring-data-elasticsearch 在多个索引中搜索特定字段

java - 将 OffsetDateTime 与 Spring Boot 和 MongoDB 一起使用会导致 MappingException

java - Sprint Reactor 过滤器与 IF then