使用 S3 消息处理程序和 Spring 集成动态设置 S3 存储桶
Set S3 bucket dynamically using S3 Message Handler and Spring Integration
如何使用 Spring 集成将 'asset' 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;
有 bucketExpression
选项,它是 SpEL 用来解析来自 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.
不是存储桶名称。您应该考虑区分 bucket 和 key
来构建复杂的子文件夹路径。为此,有一个具有类似功能的 keyExpression
选项来根据 requestMessage
.
解析存储桶中的密钥
如何使用 Spring 集成将 'asset' 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;
有 bucketExpression
选项,它是 SpEL 用来解析来自 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.
不是存储桶名称。您应该考虑区分 bucket 和 key
来构建复杂的子文件夹路径。为此,有一个具有类似功能的 keyExpression
选项来根据 requestMessage
.