1

我需要从 web 服务和 FTP 生成文件到某个位置。

路线1:

from("direct:start")
    .routeId("generateFileRoute")
    .setHeader(Exchange.HTTP_METHOD, constant("GET"))
    .setHeader(Exchange.HTTP_URI, simple(URL))
    .setHeader("Authorization", simple(APP_KEY))
    .to(URL)
    .unmarshal(listJacksonDataFormat)
    .marshal(bindyCsvDataFormat)
    .to(fileDirLoc + "?fileName=RMA_OUT_${date:now:MMddyyyy_HHmmss}.csv&noop=true");  

路由 2:FTP 路由

from("file://"+header("CamelFileNameProduced"))
    .routeId("ftpRoute")
    .to("sftp://FTP_HOST/DIR?username=???&password=???)

开始路线

Exchange exchange = template.request("direct:start", null);

Object filePathObj = exchange.getIn().getHeader("CamelFileNameProduced");

if (filePathObj != null) { // Makesure Route1 has created the file
    camelContext.startRoute("ftpRoute");     // Start FTP route
    template.send(exchange); // Send exchange from Route1 to Route2
}

当我在 FTP 路由中硬编码位置时,上面的代码有效。有人可以帮忙吗,我如何通过管道传输这 2 条路由并将 Route 1(“文件名”)的输出传递给 Route2 以进行 FTP?

4

3 回答 3

1

ftpRoute 不能简单地轮询 fileDirLoc 以获取新文件吗?

于 2016-08-23T08:32:16.870 回答
1

您不能将标头传递给file端点,它只是不能那样工作。此外,from("file://...")不能在其路径中包含动态值,即任何类型的占位符,这是官方 Camel 文档的引用:

Camel 仅支持配置了起始目录的端点。所以 directoryName 必须是一个目录。如果您只想使用单个文件,您可以使用 fileName 选项,例如,通过设置 fileName=thefilename。此外,起始目录不得包含带有 ${} 占位符的动态表达式。再次使用 fileName 选项来指定文件名的动态部分。

如果您不进行任何额外的 CSV 文件处理,我的建议是直接发送到 FTP:

from("direct:start")
    .routeId("generateFileRoute")
    .setHeader(Exchange.HTTP_METHOD, constant("GET"))
    .setHeader(Exchange.HTTP_URI, simple(URL))
    .setHeader("Authorization", simple(APP_KEY))
    .to(URL)
    .unmarshal(listJacksonDataFormat)
    .marshal(bindyCsvDataFormat)
    .to("sftp://FTP_HOST/DIR?username=???&password=??&fileName=RMA_OUT_${date:now:MMddyyyy_HHmmss}.csv");

或将 Route 2 定义从更改filedirect

from("direct:ftp-send")
    .routeId("ftpRoute")
    .pollEnrich("file:destination?fileName=${headers.CamelFileNameProduced}")
    .to("sftp://FTP_HOST/DIR?username=???&password=??&fileName=${headers.CamelFileName}")

或更改 Route 2 的定义以仅获取生成的文件:

from("file://" + fileDirLoc + "?antInclude=RMA_OUT_*.csv")
    .routeId("ftpRoute")
    .to("sftp://FTP_HOST/DIR?username=???&password=???)
于 2016-08-23T09:18:17.940 回答
-1

有一个解决方法,您可以尝试将它们组合起来:

from("direct:start")
    .routeId("generateFileRoute")
    .setHeader(Exchange.HTTP_METHOD, constant("GET"))
    .setHeader(Exchange.HTTP_URI, simple(URL))
    .setHeader("Authorization", simple(APP_KEY))
    .to(URL)
    .unmarshal(listJacksonDataFormat)
    .marshal(bindyCsvDataFormat)
    .to(fileUri.getUri())
    .setHeader(Exchange.FILE_NAME, file.getName())
    .to("sftp://FTP_HOST/DIR?username=???&password=???);

是的,您不能在文件 uri 中包含动态表达式,但您可以在其他地方生成 uri 和文件名。说一个实用方法或其他东西并在此处引用它。

于 2016-08-23T15:30:32.937 回答