我需要从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?
答案 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。说一个实用方法或其他东西,并在这里参考它。