Статьи

Представляем Spring Integration

В этой статье мы представляем Spring Integration . Если вы раньше не работали с Spring Integration, это может помочь освежить в памяти шаблоны корпоративной интеграции Грегора Хопе. Также я буду рекомендовать эту прекрасную вводную статью Джоша Лонга.

Настройка контекста

В двух словах, Enterprise Integration Patterns — это все о том, как заставить два приложения (возможно, на разных технологических стеках, на разных машинах, в разных сетях) общаться друг с другом, чтобы обеспечить единую бизнес-функциональность. Задача состоит в том, чтобы гарантировать, что эта связь остается прозрачной для бизнес-пользователей, но при этом надежной и простой для приложений. Обмен сообщениями является одним из шаблонов. Используя этот шаблон, приложения могут общаться друг с другом часто, сразу, надежно и асинхронно, используя настраиваемые форматы. Приложения общаются друг с другом, отправляя данные (называемые сообщениями ) через виртуальные каналы (называемые каналами ). Это слишком упрощенное введение в концепцию, но, надеюсь, достаточно, чтобы понять смысл остальной части статьи.

Spring Integration не является реализацией каких-либо шаблонов, но поддерживает эти шаблоны, прежде всего Messaging.

Остальная часть этой статьи довольно практична и является продолжением серии о Spring 3. Предыдущие статьи этой серии были:

  1. Привет мир с весны 3 MVC
  2. Обработка форм с помощью Spring 3 MVC
  3. Модульное тестирование и регистрация с Spring 3
  4. Обработка проверки формы с помощью Spring 3 MVC

Без дальнейших церемоний, давайте начнем.

Пример интеграции Spring Bare Bones

На момент написания этой статьи последняя версия Spring была 3.1.2.RELEASE. Однако последняя версия Spring Integration — это 2.1.3.RELEASE, как и в Maven Central . Я был слегка — и, оглядываясь назад, нелогично — удивлен, что Spring и Spring Integration должны иметь разные последние версии, но, эй, так оно и есть. Это означает, что в нашем pom.xml должно быть добавление (если вам интересно, откуда это взялось, вам нужно выполнить, по крайней мере на очень высоком уровне, серию Spring 3, о которой я упоминал ранее в этой статье).

Файл: /pom.xml

1
2
3
4
5
6
<!-- Spring integration -->                          
<dependency>                                         
 <groupId>org.springframework.integration</groupId>
 <artifactId>spring-integration-core</artifactId
 <version>2.1.3.RELEASE</version>                 
</dependency>

Эта зависимость от pom позволяет моему приложению отправлять сообщения по каналам . Обратите внимание, что теперь мы имеем в виду сообщения и каналы в области Spring Integration, что не обязательно совпадает с теми же понятиями, которые упоминались ранее в этой статье в области шаблонов Enterprise Integration. На этом этапе, вероятно, стоит взглянуть на справочное руководство по интеграции с Spring . Тем не менее, если вы только начинаете работать с Spring Integration, вам, возможно, сейчас лучше следовать этой статье. Я бы порекомендовал вам испачкать руки перед тем, как вернуться к справочному руководству, что очень хорошо, но также очень исчерпывающе и, следовательно, может быть подавляющим для начинающего.

Для простоты, и так как я обычно пытаюсь сделать тестовый подход первым (где это возможно), давайте попробуем написать несколько тестов для создания сообщения, отправить его по каналу и затем получить его. Я написал здесь о том, как использовать приложения JUnit и Logback в Spring 3 . Продолжая по тому же принципу, предполагая, что мы собираемся написать HelloWorldTest.java, давайте настроим конфигурацию Spring для теста.

Файл: \ src \ test \ resources \ org \ academy \gration \ HelloWorldTest-context.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version='1.0' encoding='UTF-8'?>
 
 <int:channel id='inputChannel'></int:channel>
 
 <int:channel id='outputChannel'>
  <int:queue capacity='10' />
 </int:channel>
 
 <int:service-activator input-channel='inputChannel'
  output-channel='outputChannel' ref='helloService' method='greet' />
 
 <bean id='helloService'
  class='org.academy.integration.HelloWorld' />
 
</beans>

Итак, что мы только что сделали? Мы попросили Spring Integration создать ‘inputChannel’ для отправки сообщений. OutputChannel для чтения сообщений. Мы также настроили передачу всех сообщений в ‘inputChannel’ в ‘helloService’. Этот helloService является экземпляром класса org.academy.integration.HelloWorld, который должен быть оборудован, чтобы что-то делать с сообщением. После этого мы также настроили передачу выходных данных ‘helloService’, то есть измененного сообщения в этом случае, в ‘outputChannel’. Просто, не правда ли? Честно говоря, когда я впервые работал с Spring Integration несколько лет назад, я обнаружил, что все это немного сбивает с толку. Это не имеет особого смысла для меня, пока я не вижу, как это работает. Итак, продолжим. Давайте добавим наш бизнес-критический класс HelloWorld.

Файл: /src/main/java/org/academy/integration/HelloWorld.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
package org.academy.integration;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class HelloWorld {
 private final static Logger logger = LoggerFactory
   .getLogger(HelloWorld.class);
  
 public String greet(String name){
  logger.debug('Greeting {}', name);
  return 'Hello ' + name;
 }
}

Как видите, при наличии имени name возвращается «Hello {name}». Теперь давайте добавим модульный тест, чтобы фактически привести его в действие.

Файл: /src/test/java/org/academy/integration/HelloWorldTest.java

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
package org.academy.integration;
 
import static org.junit.Assert.*;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.integration.MessageChannel;
import org.springframework.integration.core.PollableChannel;
import org.springframework.integration.message.GenericMessage;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class HelloWorldTest {
 private final static Logger logger = LoggerFactory
   .getLogger(HelloWorldTest.class);
 
 @Autowired
 @Qualifier('inputChannel')
 MessageChannel inputChannel;
 
 @Autowired
 @Qualifier('outputChannel')
 PollableChannel outputChannel;
 
 @Test
 public void test() {
  inputChannel.send(new GenericMessage<String>('World'));
  assertEquals(outputChannel.receive().getPayload(), 'Hello World');
  logger.debug('Checked basic Hello World with Spring Integration');
 }
 
}

Хотя это и не обязательно, я считаю, что проще использовать следующую настройку logback. Не стесняйтесь использовать его, если хотите.

Файл: /src/main/resources/logback.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<?xml version='1.0' encoding='UTF-8'?>
<configuration>
 <appender name='CONSOLE' class='ch.qos.logback.core.ConsoleAppender'>
  <encoder>
   <pattern>%d %5p | %t | %-55logger{55} | %m %n</pattern>
  </encoder>
 </appender>
 
 <logger name='org.springframework'>
  <level value='ERROR' />
  <!-- level value='INFO' />  -->
  <!--  level value='DEBUG' />  -->
 </logger>
 
 <root>
  <level value='DEBUG' />
  <appender-ref ref='CONSOLE' />
 </root>
</configuration>

Теперь просто введите «mvn -e clean install» (или используйте плагин m2e), и вы сможете запустить модульное тестирование и подтвердить, что для данной строки «World» сервис HelloWorld действительно возвращает «Hello World» по всему расположению каналов. и сообщения.

Опять же, что-то необязательное, но я настоятельно рекомендую, это запустить ‘mvn -e clean install site’. Это — при условии, что вы правильно настроили какой-то инструмент покрытия кода (в моем случае cobertura), вы получите хороший HTML-отчет, показывающий покрытие кода. В этом случае это будет 100%. Я опубликовал серию статей о качестве кода, в которой этот вопрос рассматривается более подробно, но, короче говоря, для меня очень важно убедиться, что любая практика / среда кодирования, которую я использую и рекомендую использовать, соответствует некоторым основным стандартам качества кода. , Возможность провести модульное тестирование и измерение — это одна из таких фундаментальных проверок, которую я делаю Само собой разумеется, что Spring в целом (включая интеграцию с Spring) проходит эту проверку с летающими цветами.

Вывод

Вот именно для этой статьи. В следующей статье мы увидим, как изолировать код приложения от кода , специфичного для Spring Integration, который мы имеем в нашем текущем тесте JUnit, т.е. inputChannel.send (…) и т. Д. До тех пор, удачное кодирование.

Предлагается дальнейшее чтение…
Вот ссылки на более ранние статьи в этой серии:

  1. Привет мир с весны 3 MVC
  2. Обработка форм с помощью Spring 3 MVC
  3. Модульное тестирование и регистрация с Spring 3
  4. Обработка проверки формы с помощью Spring 3 MVC

Это отличный материал, который я могу порекомендовать:

  1. Начало работы с Spring Integration
  2. Примеры кодов с помощью Spring Integration
  3. Spring Integration — Сессия 1 — Привет, мир!
  4. Spring Integration — Сессия 2 — Больше Hello Worlds

Продолжить весеннюю интеграцию со шлюзами

Ссылка: Представляем Spring Integration от нашего партнера JCG Partho в блоге Tech for Enterprise .