Загрузите файл, используя http с Spring Integration - PullRequest
0 голосов
/ 26 октября 2018

Окунаться в Java из .NET на долгое время.

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

Я хочу получить zip-файл в формате GTFS от транзитного провайдера.Этот провайдер создает простой текстовый файл с отметкой времени, указывающей время последней публикации.

В частности, производители данных публикуют текстовый файл по адресу:

https://someserver.com/gfts/published.txt

Этот файл имеет простую временную метку, указывающую, когда в последний раз был опубликован их файл данных.

Затем есть данные:

https://someserver.com/gfts/schedule.zip

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

Большинство примеров, которые я видел, используют конфигурацию на основе XML с пружиной - и я едва держусь на основе аннотаций.Я также видел примеры загрузки файла с использованием FTP / SFTP.

Мне нужно использовать http AND Мне также нужно включить Basic Authorization (в заголовке).

Это все, что я получил.Я не уверен, как это сделать?

Из документов 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 Ответ

0 голосов
/ 26 октября 2018

Если вам нужно периодически загружать такой файл, вам нужно использовать «поддельный» адаптер входящего канала, например:

    @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).

...