Статьи

Опрос конечной точки http с помощью Spring Integration

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

Spring Integration предоставляет несколько способов интеграции с конечной точкой HTTP:

  1. Исходящий адаптер Http — для отправки сообщений в конечную точку http
  2. Http Outbound gateway — для отправки сообщений в конечную точку http и для сбора ответа в виде сообщения

Моим первым инстинктом опроса конечной точки http было использование адаптера входящего канала Http, ошибочное предположение, которое я сделал, было то, что адаптер будет нести ответственность за получение информации от конечной точки — то, что фактически делает Входной шлюз Http, представляет конечную точку Http и ждите запросов, чтобы войти! Вот почему я начал с того, что мне было немного не интуитивно понятно, что для опроса URL-адреса и сбора с него контента мне фактически придется использовать Http Outbound gateway

После разъяснения рассмотрим пример, в котором я хочу опросить информационную ленту о землетрясении в Геологической службе США, доступную по этому адресу: http://earthquake.usgs.gov/earthquakes/feed/geojson/all/hour.

Вот как выглядит мой пример http Outbound компонента:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<int:channel id='quakeinfo.channel'>
  <int:queue capacity='10'/>
 </int:channel>
 
 <int:channel id='quakeinfotrigger.channel'></int:channel>
 
 <int-http:outbound-gateway id='quakerHttpGateway'
     request-channel='quakeinfotrigger.channel'
     http-method='GET'
     expected-response-type='java.lang.String'
     charset='UTF-8'
     reply-timeout='5000'
     reply-channel='quakeinfo.channel'>    
 </int-http:outbound-gateway>

Здесь исходящий http-шлюз ожидает поступления сообщений в канал quakeinfotrigger, отправляет запрос GET на URL-адрес http://earthquake.usgs.gov/earthquakes/feed/geojson/all/hour и помещает ответ json строка в канал ‘quakeinfo.channel’

Проверить это легко:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration('httpgateway.xml')
public class TestHttpOutboundGateway {
 
 @Autowired @Qualifier('quakeinfo.channel') PollableChannel quakeinfoChannel;
 @Autowired @Qualifier('quakeinfotrigger.channel') MessageChannel quakeinfoTriggerChannel;
 
 @Test
 public void testHttpOutbound() {
  quakeinfoTriggerChannel.send(MessageBuilder.withPayload('').build());
  Message<?> message = quakeinfoChannel.receive();
  assertThat(message.getPayload(), is(notNullValue()));
 }
 
}

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

Это работает чисто, однако мое первоначальное намерение состояло в том, чтобы написать опросчик, который будет запускать опрос этой конечной точки раз в минуту или около того, чтобы сделать это, я должен по сути помещать фиктивное сообщение в канал ‘quakeinfotrigger.channel’ каждую минуту. и это легко сделать, используя ‘poller’ Spring Integration и немного языка Spring Expression:

1
2
3
<int:inbound-channel-adapter channel='quakeinfotrigger.channel' expression=''''>
 <int:poller fixed-delay='60000'></int:poller>
</int:inbound-channel-adapter>

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

Все это выглядит немного запутанным, но работает хорошо — вот суть с рабочим кодом

Ссылки по теме

  1. На основании вопроса, который я задал на весеннем форуме http://forum.springsource.org/showthread.php?130711-Need-help-with-polling-to-a-json-based-HTTP-service

Справка: опрос конечной точки http с использованием Spring Integration от нашего партнера по JCG Биджу Кунджуммена в блоге all and sundry.