Camel s3消费者每次轮询同一个文件

时间:2016-06-27 13:37:07

标签: amazon-s3 apache-camel

我是apache camel框架的新手,我正在使用 2.15.1 版本。 我的用例是轮询aws s3存储桶并从中下载新创建的文件,为此我正在做如下

**camel-route**

from("aws-s3://" + Constants.S3_BUCKET + "?amazonS3Client=#client&deleteAfterRead=false") 
        .routeId("awsFileCopyRoute") 
        .log(LoggingLevel.INFO, "awsFileCopyRoute", "Camel AWS Key: ${header.CamelAwsS3Key}") 
        .to("file://" + Constants.REQ_FOLDER + "?fileName=${header.CamelAwsS3Key}"); 

the awsS3Client "client" i'm setting in applicationContext.xml as follows 

<bean id="defaultAWSCredentialsProviderChain" class="com.amazonaws.auth.DefaultAWSCredentialsProviderChain" />
<bean id="clientConfiguration" class="com.amazonaws.ClientConfiguration" />

<bean id="client" class="com.amazonaws.services.s3.AmazonS3Client">
        <constructor-arg ref="defaultAWSCredentialsProviderChain" />
        <constructor-arg ref="clientConfiguration" />
</bean>

我的问题是骆驼一次又一次地轮询和下载同一个文件。我希望camel从aws s3下载文件,这些文件在Constants.REQ_FOLDER中不存在,并且禁止驼峰下载已经存在的文件

任何人都可以帮助我!!

此致 RAGHAV

1 个答案:

答案 0 :(得分:0)

由于您使用deleteAfterRead等于false,因此每次使用者轮询S3存储桶时,您将获得相同的文件集,而Camel将再次处理每个文件。

您需要使用幂等存储库或构建自己的自定义处理器以跳过已存在于Constants.REQ_FOLDER中的文件,或者您可以使用Camel提供的缓存组件之一,将S3密钥放入文件下载后的缓存,并在重新下载之前检查缓存中的密钥,方法是在缓存上使用get操作。