如何在Apache Camel YAML DSL中结合多Header定义幂等消费者
解决方案
在Camel 3.19的YAML DSL中,要实现和Java DSL里header("CamelAwsS3Key").append(header("CamelAwsS3LastModified"))等效的幂等键逻辑,你需要将idempotent-consumer中的header配置替换为expression节点,使用Simple语言拼接两个Header的值。
修改后的完整路由配置如下:
- beans: - name: IdempotentRepositoryBean type: org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository - route: from: uri: "aws2-s3:arn:aws:s3:someBucket" parameters: # The AWS region hosting the bucket and the access credentials # are obtained from Properties file. amazonS3Client: "#awss3SourceClient" deleteAfterRead: "false" steps: - idempotent-consumer: idempotent-repository: "IdempotentRepositoryBean" # 替换原header配置,用Simple表达式组合两个Header expression: simple: "${header.CamelAwsS3Key}${header.CamelAwsS3LastModified}" skip-duplicate: true - set-header: name: "CamelFileName" simple: "${header.CamelAwsS3Key}" - to: uri: "file:C:/..."
说明
Java DSL中的append()方法本质是将两个Header的字符串值直接拼接,作为幂等判断的唯一键。上面的Simple表达式${header.CamelAwsS3Key}${header.CamelAwsS3LastModified}和Java代码的行为完全一致——当S3文件的Key不变但最后修改时间更新时,拼接后的幂等键会变化,路由就不会将其判定为重复文件,从而重新处理更新后的文件。
如果担心Key本身的字符和时间戳混淆,也可以给两个值加分隔符,比如:
${header.CamelAwsS3Key}-${header.CamelAwsS3LastModified}
内容的提问来源于stack exchange,提问作者Ralph
相关产品推荐
相关产品推荐

