我有一个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
用于我的上述用例,但却无法掌握它。是否可以将此建议用于我的用例?如果是的话,你能推荐一下吗?
感谢回应!
非常感谢和最诚挚的问候
答案 0 :(得分:0)
添加标题的逻辑
这种逻辑是什么样的?
消息(以及标题集合)是不可变的,因此您无法添加标题&#34;对于现有消息,仅从现有消息创建新消息。
重试建议(和任何建议)只能看到入站消息。
由于您的消息有效负载是List
Message
,因此您无法更改主消息有效负载(即将其更改为新的List
),当然可以更改有效负载中List
的内容。
所以,是的,如果你从其中一个列表元素创建一条新消息,并替换该列表元素,则重试将看到更改的状态,而不是原始状态。
如果你向上游添加一个可变标题(对每个列表元素),比如AtomicBoolean
,你可以设置该布尔值,而不必从原始消息创建新消息。
底线是消息本身是不可变的,消息内容可以是可变的,而且是在应用程序的域中。
通常,您需要注意这个区域,特别是如果将相同的消息发送到多个目的地,例如使用发布/订阅者频道或收件人列表路由器,但您可以根据需要改变内容。 / p>