Это немного не интуитивно понятно, если вы хотите написать поток с Spring Integration, который опрашивает конечную точку http и собирает некоторый контент из конечной точки http для дальнейшей обработки.
Spring Integration предоставляет несколько способов интеграции с конечной точкой HTTP:
- Исходящий адаптер Http — для отправки сообщений в конечную точку http
- 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-адаптер входящего канала, подключенный к поллеру, при этом поллер вызывает пустое сообщение каждую минуту.
Все это выглядит немного запутанным, но работает хорошо — вот суть с рабочим кодом
Ссылки по теме
- На основании вопроса, который я задал на весеннем форуме http://forum.springsource.org/showthread.php?130711-Need-help-with-polling-to-a-json-based-HTTP-service
Справка: опрос конечной точки http с использованием Spring Integration от нашего партнера по JCG Биджу Кунджуммена в блоге all and sundry.