Настройка контекста
В двух словах, Enterprise Integration Patterns — это все о том, как заставить два приложения (возможно, на разных технологических стеках, на разных машинах, в разных сетях) общаться друг с другом, чтобы обеспечить единую бизнес-функциональность. Задача состоит в том, чтобы гарантировать, что эта связь остается прозрачной для бизнес-пользователей, но при этом надежной и простой для приложений. Обмен сообщениями является одним из шаблонов. Используя этот шаблон, приложения могут общаться друг с другом часто, сразу, надежно и асинхронно, используя настраиваемые форматы. Приложения общаются друг с другом, отправляя данные (называемые сообщениями ) через виртуальные каналы (называемые каналами ). Это слишком упрощенное введение в концепцию, но, надеюсь, достаточно, чтобы понять смысл остальной части статьи.
Spring Integration не является реализацией каких-либо шаблонов, но поддерживает эти шаблоны, прежде всего Messaging.
Остальная часть этой статьи довольно практична и является продолжением серии о Spring 3. Предыдущие статьи этой серии были:
- Привет мир с весны 3 MVC
- Обработка форм с помощью Spring 3 MVC
- Модульное тестирование и регистрация с Spring 3
- Обработка проверки формы с помощью 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'?> xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:p='http://www.springframework.org/schema/p' xsi:schemaLocation='http://www.springframework.org/schema/beans <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)@ContextConfigurationpublic 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 (…) и т. Д. До тех пор, удачное кодирование.
Предлагается дальнейшее чтение…
Вот ссылки на более ранние статьи в этой серии:
- Привет мир с весны 3 MVC
- Обработка форм с помощью Spring 3 MVC
- Модульное тестирование и регистрация с Spring 3
- Обработка проверки формы с помощью Spring 3 MVC
Это отличный материал, который я могу порекомендовать:
- Начало работы с Spring Integration
- Примеры кодов с помощью Spring Integration
- Spring Integration — Сессия 1 — Привет, мир!
- Spring Integration — Сессия 2 — Больше Hello Worlds
Продолжить весеннюю интеграцию со шлюзами
Ссылка: Представляем Spring Integration от нашего партнера JCG Partho в блоге Tech for Enterprise .