在两个S3存储桶之间复制的骆驼路径无声地失败

时间:2019-01-28 11:32:09

标签: amazon-s3 apache-camel

我正在尝试使用骆驼路线在两个s3存储桶之间复制文件,根据文档,这应该很简单,但是路线似乎无提示地失败。

从源存储桶中读取对象,并成功将其删除。测试文件只有5K,所以不是很大。如果目标存储桶尚不存在,但未在目标存储桶中创建对象,则会创建目标存储桶。日志中没有错误。

我正在使用的Java DSL如下。

from("aws-s3://my-source-bucket?amazonS3Client=#s3Client")
.to("aws-s3://my-target-bucket?amazonS3Client=#s3Client") 

调试时,我可以看到exchange.getIn()。getBody()。toString()包含我正在测试的文本文件。

如果我尝试将S3源文件提交到可以的文件,并且如果我尝试将文件也可以正常运行的S3目标文件,那么我不认为端点配置有任何不正确之处。

我正在使用具有以下mvn依赖项的spring boot应用程序。

<dependencies>
  <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-spring-boot</artifactId>
    <version>2.23.0</version>
  </dependency>

  <dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws</artifactId>
    <version>2.23.0</version>
  </dependency>

  <dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-sqs</artifactId>
    <version>1.11.485</version>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>

我现在已经没主意了,其他人有没有东西?

谢谢, 金

1 个答案:

答案 0 :(得分:0)

自您发布此内容已经一年了,因此此答案可能与您无关。我在尝试创建从S3到S3的路由时遇到了同样的问题,但最终发现了问题。这是我对其他遇到相同问题的解决方案。

在Apache Camel S3组件中,有一个生产者操作,称为copyObject。只需将“&operation = copyObject”添加到您的生产者路线即可。所需的标题为:

  • “ CamelAwsS3BucketDestinationName”:目标存储桶的名称
  • “ CamelAwsS3DestinationKey”:目标存储桶中的对象键

我的骆驼版本:3.0.0-RC3(也应与2.24版一起使用)

    @Override
    public void configure() throws Exception {

        //URI Paths
        String inDirectory = "aws-s3://my-source-bucket?amazonS3Client=#s3Client";
        String outDirectory = "aws-s3://my-target-bucket?amazonS3Client=#s3Client";

        //For the copyObject to work you need to specify the name of the destination bucket
        String targetBucket = "my-target-bucket";

        from(inDirectory)
                .process(exchange -> {

                    //set relevant headers, copyObject needs these set to work properly
                    String key = exchange.getIn().getHeader("CamelAwsS3Key", String.class);
                    exchange.getIn().setHeader("CamelAwsS3BucketDestinationName", targetBucket);
                    exchange.getIn().setHeader("CamelAwsS3DestinationKey", key); 
                })
                .to(outDirectory + "&operation=copyObject"); 
    }

此路由还适用于在AWS账户之间复制存储桶中的对象。您只需要在每个帐户中设置相关权限。您可以了解如何进行此操作here

相关链接:

希望这对某人有帮助!让我知道您是否有任何疑问或更好的方法!