У меня есть bean-компонент service-activator
, у которого есть метод, который получает список сообщений SI в качестве входных данных.
Метод выполняет итерацию по списку, получает из него каждое сообщение SI, получает полезную нагрузку из сообщения SI, а затем отправляет полезную нагрузку в MQ (я не использую адаптеры исходящего канала для отправки сообщения в MQ; я просто использую простой ванильные JMS API).
Я настроил <request-handler-advice-chain>
на этот сервис-активатор с классом RequestHandlerRetryAdvice
и сопоставил его с retryTemplate
, настроенным для политики SimpleRetry
.
В методе service-activator
я добавил логику для добавления заголовка (скажем, MESSAGE_SENT_STATUS
) со значением "SUCCESS" к каждому SI-сообщению, если полезная нагрузка успешно отправлена в 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.
]]
Я хотел бы знать, будет ли этот заголовок сохранен в сообщении в случае возникновения исключения и повторной попытки метода service-activator
?
Итак, например, скажем, что мой список содержит 3 сообщения SI.
Первое и второе сообщение SI были успешно депонированы в MQ (что, в свою очередь, означает, что эти сообщения были дополнены заголовком MESSAGE_SENT_STATUS
со значением "УСПЕХ"), но при попытке депонировать 3-е сообщение SI возникло исключение.
ЕСЛИ я добавляю код в итерацию списка для проверки заголовка MESSAGE_SENT_STATUS
и, если его значение равно "УСПЕХ", то пропускаю эту итерацию (в основном, помещая continue
) ТО гарантирует ли это, что на MQ будет удалено только 3-е сообщение?
ИЛИ это случай повторной попытки без сохранения состояния, и все сообщения будут отправлены в MQ (поскольку MESSAGE_SENT_STATUS
в них нет)?
Я также ссылался на руководство, чтобы узнать, могу ли я использовать ExpressionEvaluatingRequestHandlerAdvice
для моего вышеприведенного варианта использования, но не смог его заполучить. Можно ли использовать этот совет для моего варианта использования? Если да, не могли бы вы предложить, как?
Цените ответ!
Большое спасибо и лучшие пожелания