使用带有Spring Integration的http下载文件

时间:2018-10-25 22:20:55

标签: spring-integration spring-integration-http

使.NET陷入Java的时间很长。

我正在寻找一个示例,该示例说明如何定期下载文件,从文件中读取文本,然后基于使用Springs Integration库和基于注释的方法的读取采取一些措施。

我想从运输提供商处提取GTFS格式的zip文件。该提供程序生成带有时间戳的简单文本文件,以指示最后的发布时间。

具体来说,数据生产者在以下位置发布文本文件:

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

此文件有一个简单的时间戳,指示上次发布其数据文件的时间。

然后有数据:

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

我试图找到一些有关如何轮询“已发布”文件的示例。基本上,我想定期下载文件并检查时间戳,以确定是否应下载时间表。

我看到的大多数示例都在spring中使用基于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 个答案:

答案 0 :(得分:1)

如果需要定期下载这样的文件,则需要使用“假”入站通道适配器,例如:

    @Bean
    @InboundChannelAdapter(value = "fileUpdateChannel"
            poller = @Poller(fixedDelay = "1000", maxMessagesPerPoll = "1"))
    public String downloadFileSchedule() {
        return () -> "";
    }

@ServiceActivator的{​​{1}}将每秒被调用一次。您不需要在HttpRequestExecutingMessageHandler上有@Poller。它本身不会做任何事情。另外,您的@ServiceActivatorfileUpdateChannel,而不是DirectChannel

我认为您不需要在本地保存下载的文件。我什至会说QueueChannel足以将文件内容作为回复消息handler.setExpectedResponseType(String.class);进行下游分析。

配置基本授权的最简单方法是使用Apache Commons HTTP Client:

payload

并在CredentialsProvider provider = new BasicCredentialsProvider(); UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("user1", "user1Pass"); provider.setCredentials(AuthScope.ANY, credentials); HttpClient client = HttpClientBuilder.create() .setDefaultCredentialsProvider(provider) .build(); 中使用它,然后应通过其HttpComponentsClientHttpRequestFactory将其注入到所提到的HttpRequestExecutingMessageHandler中。