【问题标题】:Apache Camel AWS S3 Bucket Nested Directory:Apache Camel AWS S3 存储桶嵌套目录:
【发布时间】:2017-06-24 17:28:50
【问题描述】:

我目前正在尝试将 Apache Camel 与 AWS 上的 S3 存储桶一起使用。目前,我们为代码库拥有的每个环境都有 1 个存储桶(例如:开发存储桶、e2e 存储桶、产品存储桶)。

我们想使用 1 个桶,里面有多个目录,以避免混乱并整合空间。然后我们可以将骆驼指向端点内的一个文件夹来收听(似乎可行)。这在尝试配置时变得非常有问题。 Camel 似乎希望它可以连接到的每个端点都有一个存储桶。

有人可以说明这是否可行,或者每个端点是否需要 1 个存储桶? camel documentation 没有说明是否可以。

【问题讨论】:

    标签: amazon-s3 apache-camel


    【解决方案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");
            }
        };
    }
    

    }

    【讨论】:

    • 这个例子对我来说是“点击”。谢谢你们。
    【解决方案2】:

    几个想法:

    仅 S3看起来 像文件夹。实际上,它是一个名称:值对(桶:键)。 也就是说,只有顶层的“桶”实际上是文件夹;看起来像一条路的东西,其实只是一把钥匙。

    所以 - 只需使用一个存储桶,然后过滤掉每个谓词 (http://camel.apache.org/predicate.html) 案例语句的键来处理您需要的内容。

    我确信还有其他方法,但这似乎很简单。

    还请注意 AWS s3 限制证明您有整合冲动的理由:

    • 每个 AWS 账户只有 100 个存储桶
    • 所有存储桶必须在一个区域中唯一命名(即使跨所有个 AWS 账户)

    【讨论】:

    • 您的逻辑是可靠的,但是,它需要对骆驼库进行自定义扩展/修改。让我看看能不能找到任何人用这种方式使用谓词。
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2018-04-30
    • 2018-01-26
    • 2017-06-26
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多