1

Spring Integrationを使用してS3MessageHandlerに 'asset' POJOを渡してバケットを変更するにはどうすればよいですか?S3メッセージハンドラとSpring統合を使用してS3バケットを動的に設定する

私は、資産のフォルダに基づいてバケットを '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; 

答えて

0

requestMessageからバケツを解決するようにするSPELあるbucketExpressionオプションがあります:

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を区別することを検討する必要があります。この目的のために、requestMessageに対してバケットのキーを解決する同様の機能を持つkeyExpressionオプションがあります。

+0

上記のDSLを使ってこれらの式を設定することはできますか?それとも、ハンドラを返すメソッドの内部にある必要がありますか? – KJQ

+0

AWSチャネルアダプタ用のJava DSLはありません。したがって、 'S3MessageHandler'のセッターとctorsを直接使用しなければなりません。 –

関連する問題