Java Apache Camel-将文件名从route1传递到route2哪个FTPs
我需要从webservice和FTP生成一个文件到一个位置 路线1:Java Apache Camel-将文件名从route1传递到route2哪个FTPs,java,apache-camel,camel-ftp,Java,Apache Camel,Camel Ftp,我需要从webservice和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(UR
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以进行FTP?ftpRoute不能简单地轮询fileDirLoc以获取新文件吗?您不能将头传递到
文件
端点,它就是不能这样工作。另外,来自(“file://...“”
在其路径中不能包含动态值,即任何类型的占位符,以下引用:
Camel仅支持使用起始目录配置的端点。因此directoryName必须是一个目录。如果只想使用单个文件,可以使用fileName选项,例如,通过设置fileName=fileName此外,起始目录不得包含带有${}占位符的动态表达式。再次使用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的定义从文件
更改为直接
:
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=???)
有一种解决方法,您可以尝试将它们结合起来:
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和文件名。说一个实用的方法或什么,并参考这里 非常感谢你在这方面帮助我。还有一个问题。目前我正在检查
filepathbj
并启动ftp路由
。我想完成路线1。这是正确的方法吗<代码>exchange.addOnCompletion(新同步(){@Override public void onComplete(exchange exchange){camelContext.addRoutes(ftpRouteBuilder);camelContext.startRoute(“rmaftpRoute”);template.send(“direct:ftp send”,exchange);}不是真的-您应该在执行生成路由
的同时添加并启动ftpRouteBuilder
。此外,这里不需要完成-直接
路由是同步的,这意味着当模板。请求
返回您的交换时,路由已经完成。但是没有必要对于如此多的手工工作,您可以从第一条路线调用direct:ftp-send
。只需在最后添加。到(“direct:ftp-send”)
。