Загрузите файл, используя http с Spring Integration
Окунаться в Java из.NET надолго.
Я ищу пример того, как периодически загружать файл, читать из него текст, а затем предпринимать некоторые действия на основе чтения с использованием библиотеки интеграции Springs и подхода, основанного на аннотациях.
Я хочу получить zip-файл в формате GTFS от транзитного провайдера. Этот провайдер создает простой текстовый файл с отметкой времени, указывающей время последней публикации.
В частности, производители данных публикуют текстовый файл по адресу:
https://someserver.com/gfts/published.txt
Этот файл имеет простую временную метку, чтобы указать, когда в последний раз был опубликован их файл данных.
Тогда есть данные:
https://someserver.com/gfts/schedule.zip
Я попытался найти несколько примеров о том, как опрашивать "опубликованный" файл. В основном я хочу периодически загружать файл и проверять временную метку, чтобы определить, следует ли загружать расписание.
Большинство примеров, которые я видел, используют конфигурацию на основе XML с пружиной - и я едва держусь на основе аннотаций. Я также видел примеры загрузки файла с использованием FTP / SFTP.
Мне нужно использовать http И мне также нужно включить базовую авторизацию (в шапке).
Это насколько я получил. Я не уверен, как это сделать?
Из документов Spring Integration - так я должен объявить исходящий шлюз (думаю, это то, что мне нужно?)
Вопрос сейчас в чем? Мне нужно, чтобы HttpRequestExecutingMessageHandler сохранил поток (файл) локального файла, чтобы я мог прочитать его содержимое и предпринять какие-то другие действия?
@Configuration
@EnableIntegration
public class GtfsConfiguration {
@Bean
public MessageChannel fileUpdateChannel () {
return new DirectChannel();
}
@Bean
@ServiceActivator(inputChannel = "fileUpdateChannel", polling = @Poller(fixedDelay="5000")
public HttpRequestExecutingMessageHandler fileUpdateGateway() {
HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("https://someserver.com/gtfs/raw/published.txt");
handler.setHttpMethod(HttpMethod.GET);
handler.setExpectedResponseType(byte[].class);
return handler;
}
}
1 ответ
Если вам необходимо периодически загружать такой файл, вам необходимо использовать "поддельный" адаптер входящего канала, например:
@Bean
@InboundChannelAdapter(value = "fileUpdateChannel"
poller = @Poller(fixedDelay = "1000", maxMessagesPerPoll = "1"))
public String downloadFileSchedule() {
return () -> "";
}
@ServiceActivator
для HttpRequestExecutingMessageHandler
будет вызываться каждую секунду. Вам не нужно иметь там @Poller
на @ServiceActivator
, Он не собирается ничего делать сам по себе. Плюс твой fileUpdateChannel
это DirectChannel
не QueueChannel
,
Я не думаю, что вам нужно сохранять загруженный файл локально. Я бы даже сказал, что handler.setExpectedResponseType(String.class);
вполне достаточно, чтобы получить содержимое файла в качестве ответного сообщения payload
для последующего анализа.
Самый простой способ настроить базовую авторизацию - это HTTP-клиент Apache Commons:
CredentialsProvider provider = new BasicCredentialsProvider();
UsernamePasswordCredentials credentials
= new UsernamePasswordCredentials("user1", "user1Pass");
provider.setCredentials(AuthScope.ANY, credentials);
HttpClient client = HttpClientBuilder.create()
.setDefaultCredentialsProvider(provider)
.build();
и использовать это в HttpComponentsClientHttpRequestFactory
, который вы затем должны ввести в указанное HttpRequestExecutingMessageHandler
через его setRequestFactory(ClientHttpRequestFactory requestFactory)
,