我目前正在尝试在AWS上使用带有S3存储桶的Apache Camel。我们目前为我们的代码库提供了每个环境1个桶(例如:dev bucket,e2e bucket,prod bucket)。
我们想在内部使用1个带有多个目录的存储桶,以避免混乱并巩固空间。然后我们可以将camel指向端点内的一个文件夹来监听(似乎可行)。在尝试配置时,这已成为极其困难的问题。 Camel似乎期望它可以连接到每个端点的存储桶。
是否有人可以了解这是否可行,或者每个端点是否需要1个桶? camel documentation未指定是否可行。
答案 0 :(得分:2)
确实正如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");
}
};
}
}
答案 1 :(得分:1)
S3只有看起来像文件夹一样。实际上,它是一个单一的名称:值对(bucket:key)。 也就是说,只有顶级“桶”实际上是文件夹;看起来像路径,只是一个关键。
所以 - 只需使用一个存储桶,然后过滤掉每个谓词(http://camel.apache.org/predicate.html)case语句的键,以处理您需要的内容。
我确信还有其他方法,但这似乎很简单。
还要注意AWS s3限制,证明您合并的冲动是正确的: