0

我正在尝试将文件从 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 队列获取文件名标头?

4

1 回答 1

0

请参阅文件语言的 Camel 文档,网址为

http://camel.apache.org/file-language.html

使用简单的语言 ( http://camel.apache.org/simple.html ) 使用 ${file:onlyname} 获取带有 extn 的唯一名称部分

由于您是从 SFTP 传输到 S3,您可能需要整个路径作为键,其中 ${file:name} 会有所帮助

于 2016-09-15T14:26:39.647 回答