Spring 集成重试建议是否捕获重试期间对消息所做的任何更改?

Does Spring Integration Retry Advice capture any changes done on messages during retry?

我有一个 service-activator bean,它有一个获取 SI 消息列表作为输入的方法。

该方法遍历列表,从中获取每条 SI 消息,从 SI 消息获取有效负载,然后将有效负载发送到 MQ(我没有使用任何出站通道适配器向 MQ 发送消息;我我只是在使用普通的 JMS API。

我已经将 <request-handler-advice-chain> 配置到此 service-activator 上,将 class 作为 RequestHandlerRetryAdvice 并将其映射到为 [= 配置的 retryTemplate 16=]政策。

service-activator 方法中,如果payload成功发送到MQ

EDIT1 [[ 这就是我的逻辑:

 public void doSendMessage(List<Message<?> inputMsgs) {
        for(Message<?> msg : inputMsgs) {
          if(msg.getHeaders().get("MESSAGE_SENT_STATUS") != null)
              continue;
          Object payload = msg.getPayload();

          //some code logic to send 'payload' to a MQ goes here

          msg.getHeaders().put("MESSAGE_SENT_STATUS","SUCCESS");
          return;
        }
    }
//I've just typed in the code logic; so pls ignore any typos for syntax errors.

]]

我想知道这个header是否会保留在消息中以防出现异常并重试service-activator方法?

例如,假设我的列表包含 3 条 SI 消息。

第一条和第二条 SI 消息已成功存放在 MQ 上(in-turn 意味着这些消息用 header MESSAGE_SENT_STATUS 丰富,值为 "SUCCESS")但是在尝试存入第 3 条 SI 消息时出现异常。

IF 我在 List 的迭代中添加一个代码来检查 header MESSAGE_SENT_STATUS 并且如果它的值是 "SUCCESS" 那么跳过该迭代(基本上通过放置 continueTHEN 是否会确保只有第 3 条消息将在 MQ 上退出?

OR 这是无状态重试的情况,所有消息都将被推送到 MQ(因为 MESSAGE_SENT_STATUS 不存在于它们上) ?

我还参考了手册,看看我是否可以利用 ExpressionEvaluatingRequestHandlerAdvice 来处理我的上述用例,但无法掌握它。是否可以将此建议用于我的用例?如果是,你能建议怎么做吗?

感谢回复!

非常感谢和最诚挚的问候

logic to add a header

这个逻辑是什么样的?

消息(以及 header 的 collection)是不可变的,因此您不能 "add a header" 现有消息,只能从现有消息创建新消息。

重试建议(和任何建议)只看到入站消息。

由于您的消息负载是 ListMessage,虽然您无法更改主消息负载本身(即将其更改为新的 List),但您当然可以改变payload中List的内容。

所以,是的,如果您从列表元素之一创建新消息,并替换该列表 元素,重试将看到更改后的状态,而不是原始状态.

如果您在上游(每个列表元素)添加一个可变 header,例如 AtomicBoolean,您可以设置该布尔值,而无需从原始消息创建新消息。

底线是虽然消息本身是不可变的,但消息内容是可变的,而且是在应用程序的域中。

通常,您需要注意这方面的问题,尤其是当同一条消息被发送到多个目的地时,例如使用 pub/sub 通道或收件人列表路由器,但您可以将内容更改为你愿意。