我正在尝试将文件从 SFTP 服务器发送到 S3 存储桶。我使用 apache camel 编写了一个 spring-boot 应用程序,它在一个节点上运行得非常好。我想将我的应用程序扩展到多个节点。为了避免多个节点处理相同的文件,我正在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 队列获取文件名标头?