2017-06-13 61 views
0

我目前正在尝试在AWS上使用Apache Camel和S3存储桶。对于我们的代码库(例如:dev桶,e2e桶,prod桶),我们目前每个环境都有1个桶。Apache Camel AWS S3存储桶嵌套目录:

我们想使用1个内部有多个目录的桶来避免混乱并巩固空间。然后,我们可以将骆驼指向端点内的文件夹以听取(似乎可行)。尝试配置时,这已变得非常成问题。骆驼似乎期望它可以连接到每个端点的存储桶。

有人可以阐明这是否可行,或者是否有必要每个端点有1个桶? camel documentation不指定是否可能。

回答

1

一些想法:

S3仅看起来像文件夹。在现实中,它是一个单一的名称:值对(bucket:key)。 也就是说,只有顶级“水桶”实际上是文件夹;看起来像一条路径,只是一个关键。

所以 - 只需使用一个桶,然后筛选出每个谓词(http://camel.apache.org/predicate.html)case语句的键来处理您需要的内容。

我敢肯定还有其他的方法,但这看起来很简单。

也注意到,证明你的冲动,巩固AWS S3限制:

  • 只有100个AWS账户桶
  • 所有桶必须在区域内唯一命名的(甚至是跨所有 AWS账户)
+0

你的逻辑是实心的,但是,它需要使自定义扩展/黑客骆驼库。让我看看我能否以这种方式找到任何使用谓词的人。 –

1

事实上,Alex Nano写道,s3文件夹只是对象键(“文件名”)的前缀,所以如果你想设置多个路由来监视不同的s3“文件夹”,你可以使用前缀选项的aws:s3端点

前缀工作在相同的功能,你会使用aws s3 cli,

aws s3 ls s3://mybucket/myfolderInsideBucket/ 

甲JUnit示例

public class CamelAwsS3Test extends CamelTestSupport { 

@EndpointInject(uri = "mock:result") 
private MockEndpoint resultEndpoint; 

@Before 
public void setup() throws Exception { 
    context.start(); 
} 

@Test 
public void foo() throws Exception { 
    int expectedFileCount = 3 
    resultEndpoint.expectedMessageCount(expectedFileCount); 
    resultEndpoint.assertIsSatisfied(); 
} 

@Override 
protected JndiRegistry createRegistry() throws Exception { 
    JndiRegistry registry = super.createRegistry(); 
    final String accessKey = "ACCESSKEY"; 
    final String secretKey = "SECRETKEY"; 
    AmazonS3 client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey)); 
    registry.bind("amazonS3Client", client); 

    return registry; 
} 

@Override 
protected RoutesBuilder createRouteBuilder() throws Exception { 

    return new RouteBuilder() { 
     @Override 
     public void configure() throws Exception { 
      from("aws-s3://{BUCKET}?amazonS3Client=#amazonS3Client&prefix=${FOLDER}") 
        .log("hey ${body}").to("mock:result"); 
     } 
    }; 
} 

}

+0

这个例子让我“点击”。感谢你们两位。 –