我有一个service-activator
bean,它有一个获取 SI 消息列表作为输入的方法。
该方法遍历列表,从中获取每个 SI 消息,从 SI 消息中获取有效负载,然后将有效负载发送到 MQ(我没有使用任何出站通道适配器将消息发送到 MQ;我只是使用普通普通 JMS API)。
我已经<request-handler-advice-chain>
在这个服务激活器上配置了一个类 asRequestHandlerRetryAdvice
并将其映射到retryTemplate
为SimpleRetry
策略配置的一个。
在该service-activator
方法中,MESSAGE_SENT_STATUS
如果有效负载成功发送到 MQ,我将在每个 SI 消息中添加一个带有值“SUCCESS”的标头(例如)。
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”的标头丰富),但在尝试存放第三条 SI 消息时出现异常。
如果我在 List 的迭代中添加一个代码来检查标头MESSAGE_SENT_STATUS
,并且如果它的值为“SUCCESS”然后跳过该迭代(基本上通过放置 a continue
)那么它会确保只有第三条消息将在 MQ 上退役?
或者这是无状态重试的情况,所有消息都将被推送到 MQ(因为MESSAGE_SENT_STATUS
它们不存在)?
我还参考了手册,看看我是否可以利用ExpressionEvaluatingRequestHandlerAdvice
上述用例但无法掌握它。是否可以将此建议用于我的用例?如果是的话,你能建议怎么做吗?
感谢回复!
致以真诚的感谢和诚挚的问候