0

У меня есть фасоль 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?

Цените отклик!

Большое спасибо и наилучшие пожелания

ответ

0

логики для добавления заголовка

Что эта логика выглядит?

сообщение (и сбор заголовков) неизменны, так что вы не можете «добавить заголовок» к существующему сообщению, только создать новое сообщение от существующего.

Совет повторной попытки (и любой совет) видит только входящее сообщение.

С вашей полезной нагрузкой сообщений является List из Message с, в то время как вы не можете изменить основную само сообщение полезной нагрузки (т.е. изменить его на новый List), вы можете, конечно, изменить содержание List в полезной нагрузке ,

Итак, да, если вы создадите новое сообщение из одного из элементов списка и замените этот элемент на элемент, повторная попытка увидит измененное состояние, а не исходное состояние.

Если вы добавляете измененный заголовок вверх по течению (каждому элементу списка), скажем AtomicBoolean, вы можете установить это логическое значение, не создавая новое сообщение из исходного.

Суть в том, в то время как само сообщение неизменен, содержимое сообщения может быть изменяемым, и именно в области применения.

Как правило, вам необходимо позаботиться об этой области, особенно если одно сообщение отправлено нескольким адресатам, например, с пабом/подканалом или маршрутизатором списка получателей, но вы можете изменить содержимое по своему усмотрению.

+0

№ Как я уже сказал, вы не можете мутировать объект заголовков, а только любые изменяемые значения заголовков; вы должны использовать 'MessageBuilder.fromMessage()' для создания нового построителя сообщений, установите новый заголовок и build() новое сообщение. Затем замените старое сообщение на свое место в списке. Если вы добавите заголовок раньше, скажем, в 'AtomicBoolean', вы можете изменить значение заголовка. –

+0

Как мне заменить сообщение? Как мой список узнает, какое сообщение заменить? Кроме того, если я гарантирую, что каждое сообщение в моем входящем «List inputMsgs» имеет заголовок с ключом «MESSAGE_SENT_STATUS», и во время итерации я изменяю значение этого ключа заголовка, это сработает? ИЛИ, поскольку строки являются неизменяемыми, заголовок String не будет работать? – lbvirgo

+0

Вы можете манипулировать списком с помощью 'remove (int)' и 'add (int, ...)', но лучше всего использовать preopulated измененный заголовок, например 'AtomicBoolean'. Строки неизменяемы. Если вам нужно строковое значение, используйте 'AtomicReference '. –