Apache Camel - 将文件名从route1传递到route2哪个FTP

时间:2016-08-23 01:30:09

标签: java apache-camel camel-ftp

我需要从webservice和FTP生成一个文件到一个位置。

ROUTE1:

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路由中硬编码位置时,上面的代码工作。 有人可以请求帮助,如何管理这两条路线并将Route 1的输出("文件名")传递给Route2 for FTP?

3 个答案:

答案 0 :(得分:1)

ftpRoute不能简单地为新文件调查fileDirLoc吗?

答案 1 :(得分:1)

您无法将标头传递到file端点,它只是不起作用。此外,from("file://...")在其路径中不能包含动态值,即任何类型的占位符,此处引用official Camel documentation

  

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");

或者将路线2定义从file更改为direct

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

或更改路由2的定义以仅选取生成的文件:

from("file://" + fileDirLoc + "?antInclude=RMA_OUT_*.csv")
    .routeId("ftpRoute")
    .to("sftp://FTP_HOST/DIR?username=???&password=???)

答案 2 :(得分:-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和filename。说一个实用方法或其他东西,并在这里参考它。