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" 那么跳过该迭代(基本上通过放置 continue
) THEN 是否会确保只有第 3 条消息将在 MQ 上退出?
OR 这是无状态重试的情况,所有消息都将被推送到 MQ(因为 MESSAGE_SENT_STATUS
不存在于它们上) ?
我还参考了手册,看看我是否可以利用 ExpressionEvaluatingRequestHandlerAdvice
来处理我的上述用例,但无法掌握它。是否可以将此建议用于我的用例?如果是,你能建议怎么做吗?
感谢回复!
非常感谢和最诚挚的问候
logic to add a header
这个逻辑是什么样的?
消息(以及 header 的 collection)是不可变的,因此您不能 "add a header" 现有消息,只能从现有消息创建新消息。
重试建议(和任何建议)只看到入站消息。
由于您的消息负载是 List
的 Message
,虽然您无法更改主消息负载本身(即将其更改为新的 List
),但您当然可以改变payload中List
的内容。
所以,是的,如果您从列表元素之一创建新消息,并替换该列表 元素,重试将看到更改后的状态,而不是原始状态.
如果您在上游(每个列表元素)添加一个可变 header,例如 AtomicBoolean
,您可以设置该布尔值,而无需从原始消息创建新消息。
底线是虽然消息本身是不可变的,但消息内容是可变的,而且是在应用程序的域中。
通常,您需要注意这方面的问题,尤其是当同一条消息被发送到多个目的地时,例如使用 pub/sub 通道或收件人列表路由器,但您可以将内容更改为你愿意。
我有一个 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" 那么跳过该迭代(基本上通过放置 continue
) THEN 是否会确保只有第 3 条消息将在 MQ 上退出?
OR 这是无状态重试的情况,所有消息都将被推送到 MQ(因为 MESSAGE_SENT_STATUS
不存在于它们上) ?
我还参考了手册,看看我是否可以利用 ExpressionEvaluatingRequestHandlerAdvice
来处理我的上述用例,但无法掌握它。是否可以将此建议用于我的用例?如果是,你能建议怎么做吗?
感谢回复!
非常感谢和最诚挚的问候
logic to add a header
这个逻辑是什么样的?
消息(以及 header 的 collection)是不可变的,因此您不能 "add a header" 现有消息,只能从现有消息创建新消息。
重试建议(和任何建议)只看到入站消息。
由于您的消息负载是 List
的 Message
,虽然您无法更改主消息负载本身(即将其更改为新的 List
),但您当然可以改变payload中List
的内容。
所以,是的,如果您从列表元素之一创建新消息,并替换该列表 元素,重试将看到更改后的状态,而不是原始状态.
如果您在上游(每个列表元素)添加一个可变 header,例如 AtomicBoolean
,您可以设置该布尔值,而无需从原始消息创建新消息。
底线是虽然消息本身是不可变的,但消息内容是可变的,而且是在应用程序的域中。
通常,您需要注意这方面的问题,尤其是当同一条消息被发送到多个目的地时,例如使用 pub/sub 通道或收件人列表路由器,但您可以将内容更改为你愿意。