Статьи

Rube Goldberg Spring Integration

Spring Integration обеспечивает очень хорошую абстракцию над некоторыми сложностями, связанными с интеграцией систем. Spring Integration идеально подходит под определение Facade с точки зрения интеграции, что обеспечивает упрощенный доступ к сложной базовой системе.

Чтобы проиллюстрировать это, рассмотрим простую систему, которая просто принимает сообщение и отправляет его с заглавной буквы, назовите его Echo Gateway:

1
2
3
public interface EchoGateway {
    String echo(String message);
}

и тест для этого:

1
2
3
4
5
@Test
 public void testEcho() {
  String response = echoGateway.echo('Hello');
  assertThat(response, is('HELLO'));
 }

Пока это звучит просто, реализация, использующая пружинную интеграцию, будет принимать «сообщение» и «преобразовывать» его путем преобразования в верхний регистр и возврата расширенного сообщения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<?xml version='1.0' encoding='UTF-8'?>
 xsi:schemaLocation='
   
  <channel id='requestChannel'/>
   
  <gateway id='echoGateway' service-interface='rube.simple.EchoGateway' default-request-channel='requestChannel' />
   
  <transformer input-channel='requestChannel' expression='payload.toUpperCase()' /> 
   
</beans:beans>

Работает красиво !!

Прелесть Spring Integration в том, что даже если сценарий Integration становится сложным, фасад, который он представляет обратно приложению, продолжает оставаться простым,

Рассмотрим сценарий интеграции Rube Goldberg :

Сначала диаграмма для описания извилистого потока:

Итак, что именно это делает:

  • Он принимает сообщение этого типа — «привет из весны Integ»,
  • разбивает его на отдельные слова (привет, от, весна, целое),
  • отправляет каждое слово в очередь ActiveMQ,
  • из очереди фрагменты слова выбираются обогащателем, чтобы использовать каждое слово с заглавной буквы,
  • помещение ответа обратно в очередь ответов,
  • Он подобран, переупорядочен на основе оригинальной последовательности слов,
  • объединены обратно в предложение («ПРИВЕТ ОТ ВЕСНОЙ ИНТЕГ») и
  • вернулся к заявке.

Вот как будет выглядеть конфигурация Spring Integration для такого потока:

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
39
40
41
42
43
44
45
46
47
<?xml version='1.0' encoding='UTF-8'?>
 xsi:schemaLocation='
   
  <beans:import resource='broker.xml'/>
 
  <channel id='requestChannel'>
   <queue/> 
  </channel>
   
  <channel id='responseChannel'>
   <queue/>
  </channel>
 
  <gateway id='echoGateway' service-interface='rube.complicated.EchoGateway' default-request-channel='requestChannel' default-reply-channel='responseChannel' default-reply-timeout='5000' />
   
  <channel id='toJmsOutbound'/>
   
  <splitter input-channel='requestChannel' output-channel='toJmsOutbound' expression='payload.split('\s')'>
  </splitter>
   
  <channel id='sequenceChannel'>
  </channel>
 
  <int-jms:outbound-gateway request-channel='toJmsOutbound' reply-channel='sequenceChannel' request-destination='amq.outbound' extract-request-payload='true' />
 
  <channel id='enhanceMessageChannel'/>
  <channel id='toReplyQueueChannel'/>
   
  <int-jms:inbound-gateway request-channel='enhanceMessageChannel' request-destination='amq.outbound' reply-channel='toReplyQueueChannel'/>
 
  <transformer input-channel='enhanceMessageChannel' expression='(payload + '').toUpperCase()' output-channel='toReplyQueueChannel'/>
   
  <resequencer input-channel='sequenceChannel' output-channel='aggregateChannel' release-partial-sequences='false'></resequencer>
   
  <aggregator input-channel='aggregateChannel' output-channel='responseChannel'  expression='T(com.google.common.base.Joiner).on(' ').join(![payload].toArray())'/>
   
  <poller id='poller' fixed-delay='500' default='true'/>
   
</beans:beans>

В этом потоке столько сложностей (отсюда и Рубе Голдберга), однако фасад, который Spring Integration предоставляет приложению, продолжает оставаться очень простым.

1
2
3
4
5
6
7
@Test
 public void testEcho() throws Exception{
  String amessage = 'Hello from Spring Integration';
   
  String response = echoGateway.echo(amessage);
  assertThat(response, is('HELLO FROM SPRING INTEGRATION'));
 }

Это, на мой взгляд, суть Spring Integration

У меня есть github-репозиторий с этим кодом по адресу https://github.com/bijukunjummen/rg-si.git.

Ссылка: Rube Goldberg Spring Integration от нашего партнера JCG Биджу Кунджуммен в блоге « все и вся» .