Введение в интеграцию Spring

1. Вступление

В этой статье будут представлены основные концепции Spring Integration , прежде всего на небольших практических примерах

Spring Integration предоставляет множество мощных компонентов, которые могут значительно улучшить взаимосвязь систем и процессов в рамках архитектуры предприятия.

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

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

2. Настроить

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-core</artifactId>
    <version>4.3.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-file</artifactId>
    <version>4.3.5.RELEASE</version>
</dependency>

Вы можете загрузить последние версии Spring Integration Core и https://search . maven.org/classic/#search%7Cga%7C1%7Cspring-integration-file[Spring Поддержка файлов интеграции]из Maven Central.

3. Шаблон обмена сообщениями

Одним из основополагающих шаблонов в этой библиотеке является Messaging. Шаблон сосредоточен вокруг сообщений - дискретных полезных данных, которые перемещаются из исходной системы или процесса в одну или несколько систем или процессов по заранее определенным каналам.

Исторически сложилось так, что модель возникла как наиболее гибкий способ интеграции нескольких разнородных систем таким образом, чтобы:

  • Почти полностью разъединяет системы, участвующие в интеграции

  • Позволяет участникам системы в интеграции быть полностью

независимость друг от друга лежащих в основе протоколов, форматирования или других детали реализации ** Поощряет разработку и повторное использование компонентов, участвующих в

интеграция

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 MessageSource<File> fileReadingMessageSource() {
        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 press <enter> to exit the program: ");

    while (true) {
       String input = scanner.nextLine();
       if("q".equals(input.trim())) {
          break;
      }
    }
    System.exit(0);
}

Основной метод, описанный выше, запускает контекст интеграции; он также принимает символьный ввод q из командной строки для выхода из программы. Давайте рассмотрим компоненты более подробно.

5. Spring Integration Components

5.1. Сообщение

Интерфейс org.springframework.integration.Message определяет сообщение Spring: единицу передачи данных в контексте интеграции Spring.

public interface Message<T> {
    T getPayload();
    MessageHeaders getHeaders();
}

Он определяет средства доступа к двум ключевым элементам:

  • Заголовки сообщений, по сути, контейнер значения ключа, который можно использовать для

передавать метаданные, как определено в org.springframework.integration.MessageHeaders class ** Полезная нагрузка сообщения, представляющая собой фактические данные, представляющие ценность для

передан - в нашем случае видеофайл является полезной нагрузкой

5.2. канал

Канал в Spring Integration (и, действительно, EAI) является основным каналом интеграции архитектуры Это канал, по которому сообщения передаются из одной системы в другую.

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

Каналы в Spring Integration доступны в различных вариантах, в зависимости от ваших потребностей. Они в значительной степени настраиваются и могут использоваться "из коробки", без какого-либо пользовательского кода, но если у вас есть пользовательские потребности, есть надежная структура

  • Каналы «точка-точка» (P2P) ** используются для установления линий связи «один к одному» между системами или компонентами. Один компонент публикует сообщение на канал, чтобы другой мог его забрать. На каждом конце канала может быть только один компонент.

Как мы уже видели, настроить канал так же просто, как вернуть экземпляр DirectChannel :

@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 MessageSource<File> fileReadingMessageSource() {
    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 к fileChannel1, fileChannel2 и fileChannel3 , чтобы сообщения от pubSubFileChannel могли подаваться на все три канала одновременно»

5.4. Сервисный Активатор

Активатор службы - это любой POJO, который определяет аннотацию @ ServiceActivator для данного метода. Это позволяет нам выполнять любой метод в нашем POJO при получении сообщения от входящего канала, и это позволяет нам записывать сообщения во внешний канал.

В нашем примере наш активатор службы получает файл из настроенного input канала и записывает его в настроенную папку.

5.5. адаптер

Адаптер - это компонент корпоративной интеграции, который позволяет подключаться к системе или источнику данных. Это почти буквально адаптер, как мы знаем, от подключения к сетевой розетке или электронному устройству.

Это позволяет повторно использовать подключение к другим системам «черного ящика», таким как базы данных, FTP-серверы и системы обмена сообщениями, такие как JMS, AMQP, и социальным сетям, таким как Twitter. Повсеместная необходимость подключения к этим системам означает, что адаптеры являются очень переносимыми и многоразовыми (на самом деле существует небольшой catalog of адаптеры , свободно доступные и готовые к использованию любым пользователем).

  • Адаптеры делятся на две большие категории - входящие и исходящие. **

Давайте рассмотрим эти категории в контексте адаптеров, используемых в нашем примере сценария:

  • Входящие адаптеры ** , как мы видели, используются для доставки сообщений из внешней системы (в данном случае это каталог файловой системы).

Наша конфигурация входящего адаптера состоит из:

  • @ InboundChannelAdapter аннотация, помечающая бин

Конфигурация в качестве адаптера - мы настраиваем канал, к которому Адаптер будет передавать свои сообщения (в нашем случае, файл MPEG) и poller , компонент, который помогает адаптеру опрашивать настроенную папку с заданным интервалом ** Стандартный класс конфигурации Java Spring, который возвращает

FileReadingMessageSource, реализация класса Spring Integration, которая обрабатывает опрос файловой системы

  • Исходящие адаптеры ** используются для отправки сообщений за границу. Spring Integration поддерживает большое количество готовых адаптеров для различных распространенных случаев использования.

6. Заключение

Мы рассмотрели базовый вариант использования Spring Integration, который демонстрирует конфигурацию библиотеки на основе Java и возможность повторного использования доступных компонентов.

Код Spring Integration можно развернуть как отдельный проект в JavaSE, а также как часть чего-то большего в среде JavaEE.

Хотя он не конкурирует напрямую с другими продуктами и шаблонами, ориентированными на EAI, такими как корпоративные сервисные автобусы (ESB), он является жизнеспособной и легкой альтернативой решению многих из тех проблем, для решения которых были созданы ESB.

Вы можете найти исходный код этой статьи in в проекте Github .