1. введение
В этой статье мы познакомимся с основными концепциями весенней интеграции в первую очередь на небольших практических примерах.
Spring Integration предоставляет множество мощных компонентов, которые могут значительно повысить взаимосвязанность систем и процессов в рамках корпоративной архитектуры.
Spring Integration предоставляет множество мощных компонентов, которые могут значительно повысить взаимосвязанность систем и процессов в рамках корпоративной архитектуры.
Мы рассмотрим конкретные потребности, которые эта библиотека удовлетворяет в корпоративном приложении, и почему она предпочтительнее некоторых ее альтернатив. Мы также рассмотрим некоторые доступные инструменты для дальнейшего упрощения разработки приложений на основе интеграции Spring.
2. Настройка
org.springframework.integration spring-integration-core 4.3.5.RELEASE org.springframework.integration spring-integration-file 4.3.5.RELEASE
Вы можете скачать последние версии Spring Integration Core и Spring Integration File Support из Maven Central.
3. Шаблон Обмена Сообщениями
Одним из основополагающих паттернов в этой библиотеке является обмен сообщениями. Паттерн сосредоточен вокруг сообщений – дискретных полезных нагрузок данных, которые перемещаются из исходной системы или процесса в одну или несколько систем или процессов по заранее определенным каналам.
Исторически сложилось так, что паттерн возник как наиболее гибкий способ интеграции множества разрозненных систем таким образом, чтобы:
- Почти полностью разъединяет системы, участвующие в интеграции
- Позволяет системам-участникам интеграции быть полностью агностичными по отношению к другим базовым протоколам, форматированию или другим деталям реализации
- Поощряет разработку и повторное использование компонентов, участвующих в интеграции
4. Интеграция обмена сообщениями в действии
Давайте рассмотрим базовый пример , который копирует видеофайл MPEG из назначенной папки в другую настроенную папку:
@Configuration @EnableIntegration public class BasicIntegrationConfig{ public String INPUT_DIR = "the_source_dir"; public String OUTPUT_DIR = "the_dest_dir"; public String FILE_PATTERN = "*.mpeg"; @Bean public MessageChannel fileChannel() { return new DirectChannel(); } @Bean @InboundChannelAdapter(value = "fileChannel", poller = @Poller(fixedDelay = "1000")) public MessageSourcefileReadingMessageSource() { FileReadingMessageSource sourceReader= new FileReadingMessageSource(); sourceReader.setDirectory(new File(INPUT_DIR)); sourceReader.setFilter(new SimplePatternFileListFilter(FILE_PATTERN)); return sourceReader; } @Bean @ServiceActivator(inputChannel= "fileChannel") public MessageHandler fileWritingMessageHandler() { FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(OUTPUT_DIR)); handler.setFileExistsMode(FileExistsMode.REPLACE); handler.setExpectReply(false); return handler; } }
Приведенный выше код настраивает активатор службы, канал интеграции и адаптер входящего канала.
Вскоре мы рассмотрим каждый из этих типов компонентов более подробно. Аннотация @EnableIntegration обозначает этот класс как конфигурацию Spring Integration.
Давайте начнем наш контекст приложения Spring Integration:
public static void main(String... args) { AbstractApplicationContext context = new AnnotationConfigApplicationContext(BasicIntegrationConfig.class); context.registerShutdownHook(); Scanner scanner = new Scanner(System.in); System.out.print("Please enter q and pressto exit the program: "); while (true) { String input = scanner.nextLine(); if("q".equals(input.trim())) { break; } } System.exit(0); }
Основной метод выше запускает контекст интеграции; он также принимает ввод символа ” q ” из командной строки для выхода из программы. Давайте рассмотрим компоненты более подробно.
5. Компоненты Интеграции Пружин
5.1. Сообщение
Интеграция org.springframework.integration.Message интерфейс определяет spring Message: единицу передачи данных в контексте интеграции Spring.
public interface Message{ T getPayload(); MessageHeaders getHeaders(); }
Он определяет методы доступа к двум ключевым элементам:
- Заголовки сообщений, по сути, контейнер ключ-значение, который может использоваться для передачи метаданных, как определено в org.springframework.integration.MessageHeaders класс
- Полезная нагрузка сообщения, которая является фактическими данными, представляющими ценность для передачи — в нашем случае видеофайл является полезной нагрузкой
5.2. Канал
Канал в Spring Integration (и действительно, EAI) – это базовая сантехника в архитектуре интеграции. Это канал, по которому сообщения передаются из одной системы в другую.
Вы можете думать об этом как о буквальном канале, через который интегрированная система или процесс могут передавать сообщения другим системам (или получать сообщения от них).
Каналы в весенней интеграции бывают разных вкусов, в зависимости от ваших потребностей. Они в значительной степени настраиваются и могут использоваться из коробки, без какого-либо пользовательского кода, но если у вас есть пользовательские потребности, есть надежная платформа.
Каналы Point-to-Point (P2P) используются для установления линий связи 1-к-1 между системами или компонентами. Один компонент публикует сообщение на канале, чтобы другой мог его принять. На каждом конце канала может быть только один компонент.
Как мы уже видели, настройка канала так же проста, как возврат экземпляра Direct Channel :
@Bean public MessageChannel fileChannel1() { return new DirectChannel(); } @Bean public MessageChannel fileChannel2() { return new DirectChannel(); } @Bean public MessageChannel fileChannel3() { return new DirectChannel(); }
Здесь мы определили три отдельных канала, каждый из которых идентифицируется по названию соответствующих методов геттера.
Каналы Publish-Subscribe (Pub-Sub) используются для установления линии связи “один ко многим” между системами или компонентами. Это позволит нам публиковать все 3 прямых канала, которые мы создали ранее.
Поэтому, следуя нашему примеру, мы можем заменить P2P-канал на pub-sub-канал:
@Bean public MessageChannel pubSubFileChannel() { return new PublishSubscribeChannel(); } @Bean @InboundChannelAdapter(value = "pubSubFileChannel", poller = @Poller(fixedDelay = "1000")) public MessageSourcefileReadingMessageSource() { FileReadingMessageSource sourceReader = new FileReadingMessageSource(); sourceReader.setDirectory(new File(INPUT_DIR)); sourceReader.setFilter(new SimplePatternFileListFilter(FILE_PATTERN)); return sourceReader; }
Теперь мы преобразовали адаптер входящего канала для публикации в канал Pub-Sub. Это позволит нам отправлять файлы, считываемые из исходной папки, в несколько пунктов назначения.
5.3. Мост
Мост в Spring Integration используется для подключения двух каналов сообщений или адаптеров, если по какой-либо причине они не могут подключиться напрямую.
В нашем случае мы можем использовать мост для подключения нашего канала Pub-Sub к трем различным каналам P2P (потому что каналы P2P и Pub-Sub не могут быть подключены напрямую):
@Bean @BridgeFrom(value = "pubSubFileChannel") public MessageChannel fileChannel1() { return new DirectChannel(); } @Bean @BridgeFrom(value = "pubSubFileChannel") public MessageChannel fileChannel2() { return new DirectChannel(); } @Bean @BridgeFrom(value = "pubSubFileChannel") public MessageChannel fileChannel3() { return new DirectChannel(); }
Вышеприведенная конфигурация bean теперь соединяет pubSubFileChannel с тремя P2P-каналами. Аннотация @BridgeFrom -это то, что определяет мост и может быть применено к любому количеству каналов, которые должны подписаться на канал Pub-Sub.
Мы можем прочитать приведенный выше код как “создать мост из pubSubFileChannel в file Channel 1, file Channel 2 и fileChannel3 так, чтобы сообщения из pubSubFileChannel могли подаваться на все три канала одновременно.”
5.4. Активатор сервиса
Активатор службы-это любое POJO, которое определяет аннотацию @ServiceActivator для данного метода. Это позволяет нам выполнять любой метод на нашем POJO, когда сообщение получено от входящего канала, и это позволяет нам писать сообщения на внешний канал.
В нашем примере активатор сервиса получает файл из настроенного входного канала и записывает его в настроенную папку.
5.5. Адаптер
Адаптер-это компонент корпоративной интеграции на основе шаблона, который позволяет “подключаться” к системе или источнику данных. Это почти буквально адаптер, как мы знаем его из подключения к розетке или электронному устройству.
Он позволяет повторно подключаться к другим системам “черного ящика”, таким как базы данных, FTP-серверы и системы обмена сообщениями, такие как JMS, AMQP и социальные сети, такие как Twitter. Повсеместность необходимости подключения к этим системам означает , что адаптеры очень портативны и многоразовы (на самом деле существует небольшой каталог адаптеров , свободно доступный и готовый к использованию кем угодно).
Адаптеры делятся на две большие категории — входящие и исходящие.
Давайте рассмотрим эти категории в контексте адаптеров, используемых в нашем примере сценария:
Входящие адаптеры , как мы уже видели, используются для ввода сообщений из внешней системы (в данном случае каталога файловой системы).
Наша входящая конфигурация адаптера состоит из:
- Аннотация @InboundChannelAdapter , которая помечает конфигурацию bean как адаптер — мы настраиваем канал , на который адаптер будет передавать свои сообщения (в нашем случае MPEG-файл), и poller , компонент, который помогает адаптеру опрашивать настроенную папку с заданным интервалом
- Стандартный класс конфигурации Spring java, возвращающий FileReadingMessageSource, реализация класса Spring Integration, обрабатывающая опрос файловой системы
Исходящие адаптеры используются для отправки сообщений наружу. Spring Integration поддерживает большое разнообразие готовых адаптеров для различных распространенных случаев использования.
6. Заключение
Мы рассмотрели базовый вариант использования с Spring Integration, который демонстрирует конфигурацию библиотеки на основе java и возможность повторного использования доступных компонентов.
Код Spring Integration может быть развернут как отдельный проект в Java SE, так и часть чего-то большего в среде Jakarta EE. Хотя он напрямую не конкурирует с другими продуктами и моделями, ориентированными на EAI, такими как корпоративные сервисные шины (ESBs), он является жизнеспособной и легкой альтернативой решению многих из тех же проблем, для решения которых были созданы ESBS.
Исходный код этой статьи вы можете найти в проекте Github .