Как мне создавать свои сообщения в Spring Integration?

У меня есть созданное мной приложение, которое я реорганизую, чтобы лучше использовать Spring Integration. Приложение обрабатывает содержимое файлов.

Проблема (как я это вижу) в том, что моя текущая реализация передает Files вместо Messages, то есть Spring Integration _ 3_.


Чтобы избежать дальнейшего развертывания моего собственного кода, который я затем должен поддерживать позже, мне интересно, есть ли рекомендуемая структура для создания сообщений в Spring Integration. Интересно, есть ли какая-то рекомендуемая комбинация channel с чем-то вроде MessageBuilder, которую я должен использовать.


Процесс / Код (в конечном итоге)

У меня еще нет кода для его настройки, но я хотел бы получить следующие компоненты / процессы:

  1. Получите файл, удалите верхний и нижний колонтитулы файла, возьмите каждую строку и преобразуйте ее в Message<String> (похоже, на самом деле это будет Splitter), который я отправляю ...
  2. Канал / конечная точка отправляет сообщение маршрутизатору
  3. Маршрутизатор обнаруживает строку формата в полезной нагрузке и направляет на соответствующий канал аналогично Order Маршрутизатор здесь ...
  4. Выбранный канал затем создает соответствующий тип сообщения, особенно типизированные сообщения. Например, у меня есть следующий конструктор для создания сообщения ...

    открытый класс ShippedBoxMessageBuilder реализует CustomMessageBuilder {

    @Override public Message buildMessage (ввод строки) {ShippedBox shippedBox = (ShippedBox) ShippedBoxFactory.manufactureShippedFile (ввод); вернуть MessageBuilder.withPayload (shippedBox) .build (); } ...

  5. Сообщение направляется по типу в соответствующий канал обработки.

Мое предполагаемое решение похоже на то, что я его усложнил. Однако я целенаправленно разделил две задачи: 1) разбить файл на несколько строк Messages<String> и 2) преобразовать Messages<String> в Messages<someType>. Из-за этого я думаю, что мне нужен дополнительный маршрутизатор / построитель сообщений для второй задачи.


person Crowie    schedule 13.01.2014    source источник


Ответы (1)


На самом деле существует _ 1_ в интеграции Spring.

Общая цель таких фреймворков - помочь внутренним разработчикам отделить код домена от инфраструктуры обмена сообщениями. Наконец, для работы с Spring Integration вам необходимо следовать принципам POJO и Method Invocation.

Вы пишете свои собственные сервисы, трансформеры и модели предметной области. Затем вы просто используете некоторые готовые компоненты (например, <int-file:inbound-channel-adapter>) и просто ссылаетесь оттуда на свои POJO, но не наоборот.

Я рекомендую вам прочитать книгу Spring Integration in Action, чтобы получить больше изображений по этому поводу.

Не могли бы вы объяснить причину, по которой нужно иметь дело с компонентами Spring Integration напрямую?

ОБНОВЛЕНИЕ

1) Разбиение файла на множество строк сообщений

<splitter> для вас. Вы должны написать какой-нибудь POJO, который возвращает List<String> - строки из вашего файла без верхнего и нижнего колонтитула. Как читать строки из File - не задача Spring Integration. Особенно, если «строка» - это что-то логическое, а не настоящая строка файла.

2) Преобразование сообщений в сообщения

Еще раз: нет смысла строить Message объект. Достаточно просто построить новый payload в каком-нибудь преобразователе (опять же POJO) и обернуть фреймворк в его сообщение для отправки.

Payload Type Router говорит сам за себя: он проверяет тип полезной нагрузки, но не тип сообщения. Конечно, payload тоже может быть сообщением, и даже любой заголовок тоже может быть.

В любом случае ваш Builder снимок показывает в точности создание простого сообщения интеграции Spring. И как я уже сказал: достаточно просто преобразовать одну полезную нагрузку в другую и вернуть ее из какого-нибудь POJO, который вы будете использовать как ссылку на преобразователь.

person Artem Bilan    schedule 13.01.2014
comment
Я пытаюсь использовать этот компонент напрямую, так как я буду динамически создавать разные сообщения из разных строк, а затем на основе полезной нагрузки сообщения маршрутизировать эти сообщения по разным каналам. - person Crowie; 13.01.2014
comment
Запутались ... В чем причина построения разных сообщений? Создавайте просто разные полезные нагрузки, и фреймворк позаботится о создании сообщений. Какой компонент вы используете? Покажите свой код, пожалуйста. Это могло бы пролить больше света ... - person Artem Bilan; 13.01.2014
comment
Я хочу создавать разные сообщения, потому что хочу, чтобы тип полезной нагрузки отличался. В одном случае это определенный POJO, в другом - String. Все, что у меня есть относительно этой линии рефакторинга, это следующее ... - person Crowie; 13.01.2014
comment
‹Int: входной-канал-типа-полезной нагрузки-маршрутизатора = deirMessageInputChannel› ‹int: тип сопоставления = java.lang.String channel = deirMalformedShippedFileChannel /› ‹int: тип сопоставления = com.t2.lhr.daos.ShippedBox channel = deirShippedBoxChannel /› ‹/ Int: маршрутизатор типа полезной нагрузки› - person Crowie; 13.01.2014
comment
Верно. PayloadTypeRouter выглядит хорошо. Но покажите, пожалуйста, код, который создает сообщения для этого роутера. - person Artem Bilan; 13.01.2014
comment
Я понимаю, что вы имеете в виду, говоря о структуре, создающей сообщение, извините. Я считаю, что мне понадобится маршрутизатор перед трансформатором (так как у меня есть два разных типа, которые должны быть возвращены трансформатором). В остальном - Большое спасибо! - person Crowie; 14.01.2014
comment
15 января 2014 г. Я: я больше не создаю свои собственные сообщения и теперь использую фреймворк для управления существованием сообщений. Я возвращаю только POJO - person Crowie; 15.04.2016