spring-integration-aws动态文件下载

时间:2017-12-29 02:47:26

标签: spring amazon-s3 spring-integration enterprise-integration spring-integration-aws

我需要根据邮件内容从S3下载文件。换句话说,要下载的文件以前是未知的,我将在运行时搜索并找到它。 S3StreamingMessageSource似乎并不合适,因为:

  1. 它依赖于轮询我需要等待消息的位置。
  2. 我找不到任何方法在流程中间动态创建S3StreamingMessageSourcegateway(IntegrationFlow)看起来很有趣,但我需要的是gateway(Function<Message<?>, IntegrationFlow>)不存在。
  3. 另一位候选人是S3MessageHandler,但它不支持列出我找到所需文件所需的文件。

    我可以直接使用AWS API实现自己的消息处理程序,只是想知道我是否遗漏了某些东西,因为这似乎不是一个不寻常的要求。毕竟,不是每个应用程序都只是坐在那里并继续轮询S3以获取新文件。

2 个答案:

答案 0 :(得分:1)

S3RemoteFileTemplate功能list()可以在handle()中使用。split()。然后S3MessageHandler结果并为每个要下载的远程文件调用 constructor(props) { super(props); this.state = {}; } componentDidMount() { //actually this tempObj data is coming from backend //after few loops i am assigning values like this let tempObj = { 132284688949:{3: false, 5: true, 6: false}, 262993790438:{3: false, 8: true, 11: false}, 262993790440:{3: false, 8: true, 11: false}}; this.setState(tempObj); console.log(this.state); }

虽然最后一个具有下载整个远程目录的功能。

答案 1 :(得分:0)

对于遇到这个问题的人来说,这就是我所做的。诀窍是:

  1. 稍后设置过滤器,而不是在构建时。请注意,没有addFiltersgetFilters方法,因此过滤器只能设置一次,以后无法添加。 @ artem-bilan,这很不方便。
  2. 手动调用S3StreamingMessageSource.receive

    .handle(String.class, (fileName, h) -> {
    if (messageSource instanceof S3StreamingMessageSource) {
        S3StreamingMessageSource s3StreamingMessageSource = (S3StreamingMessageSource) messageSource;
    
        ChainFileListFilter<S3ObjectSummary> chainFileListFilter = new ChainFileListFilter<>();
        chainFileListFilter.addFilters(
                new S3SimplePatternFileListFilter("**/*/*.json.gz"),
                new S3PersistentAcceptOnceFileListFilter(metadataStore, ""),
                new S3FileListFilter(fileName)
        );
        s3StreamingMessageSource.setFilter(chainFileListFilter);
    
        return s3StreamingMessageSource.receive();
    }
    log.warn("Expected: {} but got: {}.",
            S3StreamingMessageSource.class.getName(), messageSource.getClass().getName());
    return messageSource.receive();
    }, spec -> spec
        .requiresReply(false) // in case all messages got filtered out
    )