Статьи

Введение в Spring Integration Framework

Поскольку мы очень хорошо осведомлены о Spring Framework и JMS . В этой статье мы познакомимся с инфраструктурой корпоративной интеграции, известной как Spring Integration . Spring Integration — это корпоративная интегрированная среда с открытым исходным кодом, которая расширяет возможности того, что Spring мог бы сделать в одиночку. Основанная на Spring IoC, Spring Integration абстрагирует источники и места назначения сообщений, интегрирует сообщения, направляет их и управляет ими, одновременно интегрируя различные компоненты среды приложения.

Объект сообщения , используемый Spring Integration для связи, состоит из полезной нагрузки и данных заголовка . Полезная нагрузка содержит фактические данные, в то время как заголовок содержит другие метаданные, такие как id , отметка времени и т. Д. На диаграммах ниже показаны различные компоненты, участвующие в обмене данными Spring Integration.

Итак, давайте создадим пример приложения Spring Integration:

С пользовательским интерфейсом Java в качестве входящего шлюза

  1. Создайте новый проект Maven.
  2. Добавьте зависимости в файл pom.xml :
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <properties>
           <spring.version>4.0.0.RELEASE</spring.version>
           <jms.version>1.1-rev-1</jms.version>
           <activemq.version>3.1</activemq.version>
           <spring.integration.version>2.2.5.RELEASE</spring.integration.version>
           <junit.version>4.11</junit.version>
           <spring.test.version>3.2.3.RELEASE</spring.test.version>
    </properties>
     
    <!-- Spring Integration -->
    <dependency>
           <groupId>org.springframework.integration</groupId>
           <artifactId>spring-integration-core</artifactId>
           <version>${spring.integration.version}</version>
    </dependency>
    <dependency>
           <groupId>org.springframework.integration</groupId>
           <artifactId>spring-integration-jms</artifactId>
           <version>${spring.integration.version}</version>
    </dependency>
     
    <!-- Include Spring test -->
    <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-test</artifactId>
           <version>${spring.test.version}</version>
           <scope>test</scope>
    </dependency>
     
    <!-- Include JUnit -->
    <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>${junit.version}</version>
           <scope>test</scope>
    </dependency>
  3. Создайте класс сущности Student, Student.java ,   в виде:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    package com.jcombat.entity;
      
    public class Student {
        String name;
      
        public Student(String name) {
            this.name = name;
        }
      
        public String getName() {
            return name;
        }
    }
  4. Теперь давайте настроим компоненты интеграции Spring в файле контекста (назовите его Test-context.xml ):
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?xml version="1.0" encoding="UTF-8"?>
      
        <!-- Enable annotations -->
        <context:annotation-config/>
         
        <!-- Component scan to find all Spring components -->
        <context:component-scan base-package="org.jcombat.integration"/>
      
        <bean id="simpleMessageReceiver" class="com.jcombat.integration.DemoMessageReceiver" />
      
        <!-- Define a request channel to communicate -->
        <int:channel id="request" />
      
        <int:outbound-channel-adapter channel="request" ref="simpleMessageReceiver" method="processMessage" />
         
        <int:gateway id="demoGateway" service-interface="com.jcombat.integration.DemoGatewayInterface"
            default-request-channel="request"></int:gateway>
         
    </beans>

    Каналы сообщений — это то, что инкапсулирует фактические данные и отделяет производителя сообщений от потребителя.

    Шлюз — это точка входа / выхода для системы обмена сообщениями. Поэтому, если у вас есть сервер обмена сообщениями, такой как ActiveMQ или TIBCO, DefaultMessageListener действует как входящий шлюз, являясь точкой входа в нашу систему обмена сообщениями.

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

    Адаптер получает сообщения от внешней системы обмена сообщениями (JMS, SFTP и т. Д.) И «адаптирует» ее к системе обмена сообщениями (как Spring Integration Message <T> ). Входящий адаптер JMS принимает входящие внешние сообщения и «адаптирует» его к типу Spring Integration Message <T> . И наоборот: он принимает Spring Integration Message <T> и «адаптирует» его к форматам, требуемым внешней системой.

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

  5. Теперь давайте создадим интерфейс шлюза, который мы указали в контексте, как:
    1
    2
    3
    4
    5
    6
    7
    package com.jcombat.integration;
      
    import com.jcombat.entity.Student;
      
    public interface DemoGatewayInterface {
        public void process(Student student);
    }
  6. Создайте класс получателя, который в конечном итоге получит входящее сообщение из канала после маршрутизации адаптером.
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    package com.jcombat.integration;
      
    import org.springframework.integration.Message;
      
    import com.jcombat.entity.Student;
      
    public class DemoMessageReceiver {
        public void processMessage(Message<Student> message) {
            Student student = message.getPayload();
            System.out.println("Message Received - Student Name - " + student.getName());
        }
    }
  7. Это оно. Наконец, нам нужен клиент для вызова метода интерфейса шлюза. Давайте сделаем это с помощью Spring Test Framework как:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package com.jcombat.integration;
      
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
      
    import com.jcombat.entity.Student;
    import com.jcombat.integration.DemoGatewayInterface;
      
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration
    public class Test {
      
        @Autowired
        private DemoGatewayInterface request;
      
        @org.junit.Test
        public void testIntegration() {
            Student emp = new Student("Abhishek");
            request.process(emp);
        }
    }
  8. Добавьте свое приложение на сервер и запустите сервер.
  9. Перейдите к файлу Test.java, который мы создали в пункте 7 выше, и запустите его как тест JUnit. Ниже мы видим, что вы вошли в консоль IDE:

    спринт

  10. С Spring DefaultMessageListener в качестве входящего шлюза

    1. Создайте новый проект Maven.
    2. Убедитесь, что сервер ActiveMQ запущен и работает.
    3. Прежде всего, нужно сделать записи в файле pom.xml . Так же, как у нас с предыдущим сценарием.
    4. Давайте напишем файл контекста ( jmsContext.xml ) и настроим компоненты Spring Integration следующим образом:
      01
      02
      03
      04
      05
      06
      07
      08
      09
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      <?xml version="1.0" encoding="UTF-8"?>
        
          <bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
              <property name="brokerURL" value="tcp://localhost:61616" />
          </bean>
        
          <bean id="messageListenerContainer"
              class="org.springframework.jms.listener.DefaultMessageListenerContainer">
              <property name="connectionFactory" ref="connectionFactory" />
              <property name="destinationName" value="testQueue" />
              <property name="maxConcurrentConsumers" value="1" />
              <property name="concurrentConsumers" value="1" />
              <property name="receiveTimeout" value="5000" />
              <property name="recoveryInterval" value="60000" />
              <property name="autoStartup" value="true" />
          </bean>
        
          <!-- Define a channel to communicate out to a JMS Destination -->
          <int:channel id="inbound" />
          <int:channel id="outbound" />
        
          <bean id="simpleMessageListener" class="com.jcombat.listener.SimpleMessageListener" />
           
          <int-jms:message-driven-channel-adapter
              id="jmsIn" container="messageListenerContainer" channel="inbound"
              acknowledge="auto" />
        
          <int:service-activator input-channel="inbound"
              output-channel="outbound" ref="simpleMessageListener" method="onMessage" />
        
          <int-jms:outbound-channel-adapter id="jmsOut"
              channel="outbound" connection-factory="connectionFactory"
              destination-name="sampleQueue" />
        
      </beans>
    5. Давайте загрузим контекст при запуске сервера. Для этого сделайте соответствующую запись в файле web.xml как:
      01
      02
      03
      04
      05
      06
      07
      08
      09
      10
      11
      12
      13
      14
      15
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                              http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
                              version="3.0">
                               
          <context-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>/WEB-INF/jmsContext.xml</param-value>
          </context-param>
        
          <listener>
              <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
          </listener>
      </web-app>
    6. Создайте класс слушателя, который будет наконец получать сообщение, как:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      package com.jcombat.listener;
        
      public class SimpleMessageListener {
        
          public String onMessage(String message) {
              System.out.println(message);
              return message;
          }
      }
    7. Время запустить наше приложение. Так что это должно работать как:
      1. Отправить пользовательское сообщение в testQueue :

        sprInt1

      2. Слушатель вызывается, и его метод onMessage выполняется, регистрируя входящее сообщение на консоли IDE как:

        sprInt2

      3. Сообщение передается по исходящему каналу и через исходящий адаптер в приемник sampleQueue , как показано ниже:

        sprInt3

    8. Скачать исходный код

      Вы можете скачать исходный код здесь .

      Ссылка: Введение в Spring Integration Framework от нашего партнера JCG Абхиманью Прасада в блоге jCombat .