1

从 .NET 开始涉足 Java 已经很长时间了。

我正在寻找有关如何定期下载文件、从中读取文本然后使用 Springs 集成库和基于注释的方法根据读取采取一些行动的示例。

我想从运输提供商那里提取 GTFS 格式的 zip 文件。此提供程序会生成一个简单的文本文件,其中包含一个时间戳来指示上次发布时间。

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

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

这个文件有一个简单的时间戳来指示他们的数据文件最后一次发布的时间。

然后是数据:

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

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

我见过的大多数示例都是使用基于 XML 的配置和 spring - 我几乎没有坚持基于注释。我还看到了使用 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;
    }

}
4

1 回答 1

1

如果需要定期下载这样的文件,则需要使用“假”的 Inbound Channel Adapter,例如:

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

@ServiceActivatorfor 将每秒HttpRequestExecutingMessageHandler被调用一次。您不需要@Poller@ServiceActivator. 它不会自己做任何事情。加上你的fileUpdateChannel是一个DirectChannel,不是QueueChannel

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

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

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

于 2018-10-26T14:44:13.633 回答