Загрузите файл, используя 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),

Другие вопросы по тегам