У меня есть фасоль service-activator
, у которого есть метод, который получает список сообщений SI в качестве входных данных.Помогает ли Spring Retration Advice зафиксировать любые изменения, сделанные в сообщениях во время повторной попытки?
Метод выполняет итерацию по списку, получает от него каждое сообщение SI, получает полезную нагрузку из сообщения SI, а затем отправляет полезную нагрузку в MQ (я не использую какие-либо адаптеры исходящих каналов для отправки сообщения в MQ; m, используя простые API JMS для ванили).
Я настроил <request-handler-advice-chain>
на этом сервис-активатор с классом, как RequestHandlerRetryAdvice
и замэпил к retryTemplate
, настроенным для SimpleRetry
политики.
В методе service-activator
я добавил логику для добавления заголовка (скажем MESSAGE_SENT_STATUS
) со значением «УСПЕХ» для каждого сообщения 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
со значением как «УСПЕХ»), но было исключение при попытке внести третье сообщение SI ,
IF добавить код в итерации списка для проверки заголовка MESSAGE_SENT_STATUS
и, если его значение «УСПЕХ», то пропустите эту итерацию (в основном путем размещения continue
) ТОГДА это будет гарантировать, что только Третье сообщение будет удалено на MQ?
OR Это случай повторения попытки бездействия и все сообщения будут перенесены в MQ (с MESSAGE_SENT_STATUS
нет на них)?
Я также обращался к руководству, чтобы узнать, могу ли я использовать ExpressionEvaluatingRequestHandlerAdvice
для моего предыдущего варианта использования, но не смог его удержать. Можно ли использовать этот совет для моего варианта использования? Если да, можете ли вы предложить PLS?
Цените отклик!
Большое спасибо и наилучшие пожелания
№ Как я уже сказал, вы не можете мутировать объект заголовков, а только любые изменяемые значения заголовков; вы должны использовать 'MessageBuilder.fromMessage()' для создания нового построителя сообщений, установите новый заголовок и build() новое сообщение. Затем замените старое сообщение на свое место в списке. Если вы добавите заголовок раньше, скажем, в 'AtomicBoolean', вы можете изменить значение заголовка. –
Как мне заменить сообщение? Как мой список узнает, какое сообщение заменить? Кроме того, если я гарантирую, что каждое сообщение в моем входящем «List inputMsgs» имеет заголовок с ключом «MESSAGE_SENT_STATUS», и во время итерации я изменяю значение этого ключа заголовка, это сработает? ИЛИ, поскольку строки являются неизменяемыми, заголовок String не будет работать? –
lbvirgo
Вы можете манипулировать списком с помощью 'remove (int)' и 'add (int, ...)', но лучше всего использовать preopulated измененный заголовок, например 'AtomicBoolean'. Строки неизменяемы. Если вам нужно строковое значение, используйте 'AtomicReference'. –