2017-06-13 48 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

這個例子讓我「點擊」。感謝你們兩位。 –