Настройка контекста
В первой статье мы создали простое Java-приложение, в котором
- Сообщение было отправлено по каналу,
- Он был перехвачен службой, т. Е. POJO, и изменен.
- Затем он был отправлен по другому каналу
- Измененное сообщение было прочитано с канала и отображено.
Однако, делая это — имея в виду, что мы просто вводили понятия там — мы написали некоторый специфический для Spring код в нашем приложении, то есть тестовые классы. В этой статье мы позаботимся об этом и сделаем код нашего приложения максимально изолированным от Spring Integration API.
Это делается тем, что Spring Integration называет шлюзами . Шлюзы существуют с единственной целью абстрагирования связанного с обменом сообщениями кода от бизнес-кода. Бизнес-логике на самом деле может быть наплевать на то, достигается ли функциональность, отправляя сообщение по каналу или делая вызов SOAP. Эта абстракция — хотя и логичная и желательная — до сих пор не была очень практичной.
На этом этапе, вероятно, стоит взглянуть на справочное руководство по интеграции с Spring . Тем не менее, если вы только начинаете работать с Spring Integration, вам, возможно, сейчас лучше следовать этой статье. Я бы порекомендовал вам испачкать руки перед тем, как вернуться к справочному руководству, что очень хорошо, но также очень исчерпывающе и, следовательно, может быть подавляющим для начинающего.
Шлюзом может быть POJO с аннотациями (что удобно, но, на мой взгляд, превосходит все цели) или с конфигурациями XML (может очень быстро превратиться в кошмар в любом приложении приличного размера, если его не проверять). В конце концов, это действительно ваш выбор, но мне нравится идти по пути XML. Параметры конфигурации для обоих стилей подробно описаны в этом разделе справочной реализации.
Весенняя интеграция со шлюзами
Итак, давайте создадим еще один тест с добавлением шлюза для нашего сервиса HelloWorld (дополнительную информацию см. В первой статье этой серии ). Давайте начнем с конфигурации Spring для теста.
Файл: src / test / resources / org / academy / интеграции / HelloWorld1Test-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
|
<?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' /> <int:gateway service-interface='org.academy.integration.Greetings' default-request-channel='inputChannel' default-reply-channel='outputChannel'></int:gateway></beans> |
В этом случае все, что отличается, это то, что мы добавили шлюз. Этот интерфейс называется org.academy.integration.Greetings. Он взаимодействует как с «inputChannel», так и с «outputChannel», чтобы отправлять и читать сообщения соответственно. Давайте напишем интерфейс.
Файл: /src/main/java/org/academy/integration/Greetings.java
|
1
2
3
4
5
6
7
8
|
package org.academy.integration;public interface Greetings { public void send(String message); public String receive();} |
И тогда мы добавим реализацию этого интерфейса. Подождите. Там нет реализации. И нам не нужна никакая реализация. Spring использует что-то под названием GatewayProxyFactoryBean, чтобы внедрить некоторый базовый код в этот шлюз, который позволяет ему читать простые строковые сообщения без необходимости что-либо делать вообще. Это правильно. Вообще ничего
Примечание. Вам нужно будет добавить больше кода для большинства производственных сценариев — при условии, что вы не используете платформу Spring Integration для простого перемещения по строкам. Так что не привыкать к бесплатным обедам. Но, пока он здесь, давайте копаться.
Теперь давайте напишем новый тестовый класс, используя шлюз (и вообще не будем взаимодействовать с каналами и сообщениями).
Файл: /src/test/java/org/academy/integration/HelloWorld1Test.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
|
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.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfigurationpublic class HelloWorld1Test { private final static Logger logger = LoggerFactory .getLogger(HelloWorld1Test.class); @Autowired Greetings greetings; @Test public void test() { greetings.send('World'); assertEquals(greetings.receive(), 'Hello World'); logger.debug('Spring Integration with gateways.'); }} |
Наш тестовый класс теперь намного чище. Он не знает ни о каналах, ни о сообщениях, ни о чем-либо, касающемся Spring Integration. Он знает только об экземпляре приветствия, которому он передал некоторые данные методом .send (), и вернул измененные данные методом .receive (). Следовательно, бизнес-логика не обращает внимания на логическую схему, что делает код намного чище.
Теперь просто введите «mvn -e clean install» (или используйте плагин m2e), и вы сможете запустить модульное тестирование и подтвердить, что для данной строки «World» сервис HelloWorld действительно возвращает «Hello World» по всему расположению каналов. и сообщения.
Опять же, что-то необязательное, но я настоятельно рекомендую, это запустить ‘mvn -e clean install site’. Это — при условии, что вы правильно настроили какой-то инструмент покрытия кода (в моем случае cobertura), вы получите хороший HTML-отчет, показывающий покрытие кода. В этом случае это будет 100%. Я опубликовал серию статей о качестве кода, в которой этот вопрос рассматривается более подробно, но, короче говоря, для меня очень важно убедиться, что любая практика / среда кодирования, которую я использую и рекомендую использовать, соответствует некоторым основным стандартам качества кода. , Возможность провести модульное тестирование и измерение — это одна из таких фундаментальных проверок, которую я делаю Само собой разумеется, что Spring в целом (включая интеграцию с Spring) проходит эту проверку с летающими цветами.
Вывод
Вот именно для этой статьи. Удачного кодирования.
Предлагается дальнейшее чтение…
Вот ссылки на более ранние статьи в этой серии:
- Привет мир с весны 3 MVC
- Обработка форм с помощью Spring 3 MVC
- Модульное тестирование и регистрация с Spring 3
- Обработка проверки формы с помощью Spring 3 MVC
- Представляем Spring Integration
Это отличный материал, который я могу порекомендовать:
- Начало работы с Spring Integration
- Примеры кодов с помощью Spring Integration
- Spring Integration — Сессия 1 — Привет, мир!
- Spring Integration — Сессия 2 — Больше Hello Worlds
Ссылка: Spring Integration с Gatways от нашего партнера JCG Partho в блоге Tech for Enterprise .