使用S3消息处理程序和Spring Integration动态设置S3存储桶

J

如何使用Spring Integration将“资产” POJO传递到S3MessageHandler并更改存储桶?

我希望能够根据资产中的文件夹将存储桶更改为“ root-bucket / a / b / c”。

每个资产都可能具有不同的子路径。

    @Bean
    IntegrationFlow flowUploadAssetToS3()
    {
        return flow -> flow
            .channel(this.channelUploadAsset)
            .channel(c -> c.queue(10))
            .publishSubscribeChannel(c -> c
                .subscribe(s -> s
                    // Publish the asset?
                    .<File>handle((p, h) -> this.publishS3Asset(
                        p,
                        (Asset)h.get("asset")))
                    // Set the action
                    .enrichHeaders(e -> e
                        .header("s3Command", Command.UPLOAD.name()))
                    // Upload the file
                    .handle(this.s3MessageHandler())));
    }

    MessageHandler s3MessageHandler()
    {
        return new S3MessageHandler(amazonS3, "root-bucket");
    }

感谢下面的答案,我像这样工作:

final String bucket = "'my-root";
final Expression bucketExpression = PARSER.parseExpression(bucket);

final Expression keyExpression = PARSER.parseExpression("headers['asset'].bucket");

final S3MessageHandler handler = new S3MessageHandler(amazonS3, bucketExpression);
handler.setKeyExpression(keyExpression);
return handler;
阿尔特姆·比兰(Artem Bilan)

bucketExpressionSpEL有一个选项可以让您从中解析存储桶requestMessage

 private static SpelExpressionParser PARSER = new SpelExpressionParser();

 MessageHandler s3MessageHandler() {
    Expression bucketExpression =
                PARSER.parseExpression("payload.bucketProperty");
    return new S3MessageHandler(amazonS3, bucketExpression);
}

另请注意,这root-bucket/a/b/c.不是存储区名称。您应该考虑区分存储桶和key构建该复杂的子文件夹路径。为此,keyExpression可以使用具有类似功能的选项来针对解析存储桶中的密钥requestMessage

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章