Статьи

Весенняя интеграция со шлюзами

Это вторая статья из серии Spring Integration. Эта статья основана на первой статье, в которой мы представили Spring Integration .

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

В первой статье мы создали простое Java-приложение, в котором

  1. Сообщение было отправлено по каналу,
  2. Он был перехвачен службой, т. Е. POJO, и изменен.
  3. Затем он был отправлен по другому каналу
  4. Измененное сообщение было прочитано с канала и отображено.

Однако, делая это — имея в виду, что мы просто вводили понятия там — мы написали некоторый специфический для 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'?>
 
 <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)
@ContextConfiguration
public 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) проходит эту проверку с летающими цветами.

Вывод

Вот именно для этой статьи. Удачного кодирования.

Предлагается дальнейшее чтение…

Вот ссылки на более ранние статьи в этой серии:

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

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

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

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