Это немного не интуитивно понятно, если вы хотите написать поток с 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:channelid='quakeinfo.channel'>  <int:queuecapacity='10'/> </int:channel> <int:channelid='quakeinfotrigger.channel'></int:channel>  <int-http:outbound-gatewayid='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')publicclassTestHttpOutboundGateway { @Autowired@Qualifier('quakeinfo.channel') PollableChannel quakeinfoChannel; @Autowired@Qualifier('quakeinfotrigger.channel') MessageChannel quakeinfoTriggerChannel; @Test publicvoidtestHttpOutbound() {  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-adapterchannel='quakeinfotrigger.channel'expression=''''> <int:pollerfixed-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.