Spring Integration Retry Advice是否捕获重试期间对消息所做的任何更改?

时间:2015-10-20 00:44:24

标签: request integration handler spring-integration retrypolicy

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

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

我已将<request-handler-advice-chain>配置到此服务激活器上,类为RequestHandlerRetryAdvice,并将其映射到为retryTemplate策略配置的SimpleRetry

service-activator方法中,如果有效负载成功发送到MQ,我会在逻辑中添加一个标头(比如说MESSAGE_SENT_STATUS),并为每条SI消息添加一个值“SUCCESS”。 / p>

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.

]]

我想知道如果有异常且重试service-activator方法,是否会在邮件中保留此标头?

因此,举例来说,我的列表包含3条SI消息。

第一个和第二个SI消息已成功存放在MQ上(这反过来意味着这些消息使用标题MESSAGE_SENT_STATUS进行了丰富,其值为“SUCCESS”)但在尝试存放时存在异常第3条SI消息。

IF 我在List的迭代中添加代码以检查标头MESSAGE_SENT_STATUS,如果其值为“SUCCESS”,则跳过该迭代(基本上放置{{1 }}) THEN 会确保只有第3条消息会在MQ上退役吗?

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

我也在参考手册,看看我是否可以将MESSAGE_SENT_STATUS用于我的上述用例,但却无法掌握它。是否可以将此建议用于我的用例?如果是的话,你能推荐一下吗?

感谢回应!

非常感谢和最诚挚的问候

1 个答案:

答案 0 :(得分:0)

  

添加标题的逻辑

这种逻辑是什么样的?

消息(以及标题集合)是不可变的,因此您无法添加标题&#34;对于现有消息,仅从现有消息创建新消息。

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

由于您的消息有效负载是List Message,因此您无法更改主消息有效负载(即将其更改为新的List),当然可以更改有效负载中List的内容。

所以,是的,如果你从其中一个列表元素创建一条新消息,并替换该列表元素,则重试将看到更改的状态,而不是原始状态。

如果你向上游添加一个可变标题(对每个列表元素),比如AtomicBoolean,你可以设置该布尔值,而不必从原始消息创建新消息。

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

通常,您需要注意这个区域,特别是如果将相同的消息发送到多个目的地,例如使用发布/订阅者频道或收件人列表路由器,但您可以根据需要改变内容。 / p>