Способ получения сообщений из предыдущих потоков в линейной цепочке

Недавно у меня был сценарий, как показано ниже:

Flow_A ------>  Flow_B ------>  Flow_C ------>  Flow_D

Где

  • Flow_A является инициатором и должен передать messageA.
  • Flow_B должен передать сообщениеA+сообщениеB.
  • Flow_C должен передать сообщениеA+сообщениеB+сообщениеC
  • Flow_D должен передать сообщениеA+сообщениеB+сообщениеC+сообщениеD.

Итак, я думал дополнить заголовки старым сообщением и снова перейти на другой поток. Но в конце он будет очень громоздким.

Должен ли я где-то сохранить сообщение, а затем передать messageId в заголовке, чтобы следующий поток мог получить старое сообщение с messageId?

Каким должен быть лучший способ добиться этого?


person Dhiraj Singh    schedule 04.06.2020    source источник


Ответы (1)


См. Шаблон проверки претензий: https://docs.spring.io/spring-integration/docs/current/reference/html/message-transformation.html#claim-check

  1. Вы сохраняете сообщение, используя ClaimCheckInTransformer, и получаете его id в качестве выходной полезной нагрузки.
  2. Вы перемещаете это id в заголовок и создаете следующее сообщение.
  3. Повторите шаги №1 и №2, чтобы это второе сообщение было готово для третьего.
  4. И так далее, чтобы подготовить среду для четвертого сообщения.

Чтобы восстановить эти сообщения, вам нужно повторить процедуру в обратном направлении. Получите заголовок сообщения в payload, удалите его и вызовите ClaimCheckOutTransformer, чтобы восстановить сохраненное сообщение. Я говорю «удалить заголовок», чтобы стек был правильно восстановлен: ClaimCheckOutTransformer имеет такую ​​логику:

AbstractIntegrationMessageBuilder<?> responseBuilder = getMessageBuilderFactory().fromMessage(retrievedMessage);
    // headers on the 'current' message take precedence
    responseBuilder.copyHeaders(message.getHeaders());

Таким образом, без удаления этого заголовка тот же идентификатор сообщения будет перенесен на следующий шаг, и вы получите цикл — StackOverflowError.

Другой - хранить сообщения вручную где-то, например. MetadataStore и соберите их идентификаторы в список для полезной нагрузки. Таким образом, вам не нужна дополнительная логика для работы с заголовками. Все в списке вашей полезной нагрузки. Вы можете проконсультироваться в магазине в любое время для любого элемента id в этом списке!

person Artem Bilan    schedule 04.06.2020
comment
Похоже, пришло время принять ответ: stackoverflow.com/help/someone-answers! - person Artem Bilan; 05.06.2020