如何使用Camel和Hazelcast将文件从SFTP发送到S3?

时间:2016-09-15 11:56:01

标签: java amazon-s3 apache-camel hazelcast camel-ftp

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

1 个答案:

答案 0 :(得分:0)

请参阅

的文件语言的Camel文档

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

使用简单语言(http://camel.apache.org/simple.html)使用$ {file:onlyname}

获取仅使用extn的名称部分

由于您要从SFTP转移到S3,因此您可能需要将整个路径作为密钥,其中$ {file:name}会有所帮助