Поскольку мы очень хорошо осведомлены о Spring Framework и JMS . В этой статье мы познакомимся с инфраструктурой корпоративной интеграции, известной как Spring Integration . Spring Integration — это корпоративная интегрированная среда с открытым исходным кодом, которая расширяет возможности того, что Spring мог бы сделать в одиночку. Основанная на Spring IoC, Spring Integration абстрагирует источники и места назначения сообщений, интегрирует сообщения, направляет их и управляет ими, одновременно интегрируя различные компоненты среды приложения.
Объект сообщения , используемый Spring Integration для связи, состоит из полезной нагрузки и данных заголовка . Полезная нагрузка содержит фактические данные, в то время как заголовок содержит другие метаданные, такие как id , отметка времени и т. Д. На диаграммах ниже показаны различные компоненты, участвующие в обмене данными Spring Integration.
Итак, давайте создадим пример приложения Spring Integration:
С пользовательским интерфейсом Java в качестве входящего шлюза
- Создайте новый проект Maven.
- Добавьте зависимости в файл pom.xml :
010203040506070809101112131415161718192021222324252627282930313233343536
<
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
>
- Создайте класс сущности Student, Student.java , в виде:
01020304050607080910111213
package com.jcombat.entity;
public class Student {
String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
- Теперь давайте настроим компоненты интеграции Spring в файле контекста (назовите его Test-context.xml ):
010203040506070809101112131415161718192021222324252627282930313233
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:context
=
"http://www.springframework.org/schema/context"
xmlns:jms
=
"http://www.springframework.org/schema/jms"
xmlns:p
=
"http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd
<!-- 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> и «адаптирует» его к форматам, требуемым внешней системой.
Таким образом, как только сообщение поступает через входящий адаптер , оно переходит от одного компонента к другому через каналы . В конечном счете, было бы целесообразно написать это сообщение куда-нибудь. Мы можем написать сообщение, используя исходящий адаптер .
- Теперь давайте создадим интерфейс шлюза, который мы указали в контексте, как:
1234567
package com.jcombat.integration;
import com.jcombat.entity.Student;
public interface DemoGatewayInterface {
public void process(Student student);
}
- Создайте класс получателя, который в конечном итоге получит входящее сообщение из канала после маршрутизации адаптером.
010203040506070809101112
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());
}
}
- Это оно. Наконец, нам нужен клиент для вызова метода интерфейса шлюза. Давайте сделаем это с помощью Spring Test Framework как:
0102030405060708091011121314151617181920212223
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);
}
}
- Добавьте свое приложение на сервер и запустите сервер.
- Перейдите к файлу Test.java, который мы создали в пункте 7 выше, и запустите его как тест JUnit. Ниже мы видим, что вы вошли в консоль IDE:
- Создайте новый проект Maven.
- Убедитесь, что сервер ActiveMQ запущен и работает.
- Прежде всего, нужно сделать записи в файле pom.xml . Так же, как у нас с предыдущим сценарием.
- Давайте напишем файл контекста ( jmsContext.xml ) и настроим компоненты Spring Integration следующим образом:
01020304050607080910111213141516171819202122232425262728293031323334353637383940414243444546474849
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
xmlns:xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:context
=
"http://www.springframework.org/schema/context"
xmlns:jms
=
"http://www.springframework.org/schema/jms"
xmlns:p
=
"http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd
<
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
>
- Давайте загрузим контекст при запуске сервера. Для этого сделайте соответствующую запись в файле web.xml как:
010203040506070809101112131415
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
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
>
- Создайте класс слушателя, который будет наконец получать сообщение, как:
123456789
package com.jcombat.listener;
public class SimpleMessageListener {
public String onMessage(String message) {
System.out.println(message);
return message;
}
}
- Время запустить наше приложение. Так что это должно работать как:
С Spring DefaultMessageListener в качестве входящего шлюза
Скачать исходный код
Вы можете скачать исходный код здесь .
Ссылка: | Введение в Spring Integration Framework от нашего партнера JCG Абхиманью Прасада в блоге jCombat . |