我正在尝试将文件从SFTP服务器发送到S3 Bucket。我使用apache camel编写了一个spring-boot应用程序,它对一个节点完全正常。我想将我的应用程序扩展到多个节点。为避免多个节点处理同一文件,我使用此tutorial HazelcastIdempotentRepository
。
from(source)
.pollEnrich(source)
.log("Uploading file ${file:name} started...")
.setHeader(S3Constants.CONTENT_LENGTH, simple("${in.header.CamelFileLength}"))
.setHeader(S3Constants.KEY, simple("${in.header.CamelFileNameOnly}"))
.toF("hazelcast:%sfoo", HazelcastConstants.SEDA_PREFIX);
fromF("hazelcast:%sfoo", HazelcastConstants.SEDA_PREFIX)
.idempotentConsumer(simple("*"), hazelcastIdempotentRepo)
.setHeader(HazelcastConstants.OBJECT_ID, simple("${exchangeId}"))
.setHeader(HazelcastConstants.OPERATION, constant(HazelcastConstants.PUT_OPERATION))
//.setHeader(S3Constants.CONTENT_LENGTH, simple("${in.header.CamelAwsS3ContentLength}"))
.setHeader(S3Constants.KEY, header(S3Constants.KEY)) // How to get file name here ??
.toF(destination)
.log("Uploading file ${file:name} completed...");
我收到以下异常
java.lang.IllegalArgumentException: AWS S3 Key header missing.
当我在SFTP端点上轮询时,这是有效的。
.setHeader(S3Constants.KEY, simple("${in.header.CamelFileNameOnly}"))
如果我对文件名进行硬编码,则按预期工作。
.setHeader(S3Constants.KEY, constant("test.txt"))
如何从Hazelcast Queue获取fileName标头?
答案 0 :(得分:0)
请参阅
的文件语言的Camel文档http://camel.apache.org/file-language.html
使用简单语言(http://camel.apache.org/simple.html)使用$ {file:onlyname}
获取仅使用extn的名称部分由于您要从SFTP转移到S3,因此您可能需要将整个路径作为密钥,其中$ {file:name}会有所帮助