【问题标题】:How to Send files from SFTP to S3 using Camel and Hazelcast?如何使用 Camel 和 Hazelcast 将文件从 SFTP 发送到 S3?
【发布时间】:2017-01-23 10:33:00
【问题描述】:

我正在尝试将文件从 SFTP 服务器发送到 S3 存储桶。我使用 apache camel 编写了一个 spring-boot 应用程序,它在一个节点上运行得非常好。我想将我的应用程序扩展到多个节点。为了避免多个节点处理同一个文件,我使用HazelcastIdempotentRepository 使用这个tutorial。

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 队列中获取文件名标头?

【问题讨论】:

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


    【解决方案1】:

    请参阅 Camel 文档以了解文件语言,网址为

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

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

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

    【讨论】:

    • 文件语言可用于文件组件(file:、direct:、ftp:)等。不适用于hazelcast:seda
    • 是否需要编写脚本,AWS S3 客户端不会帮忙吗?
    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多