Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache Camel-将文件名从route1传递到route2哪个FTPs_Java_Apache Camel_Camel Ftp - Fatal编程技术网

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

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

我需要从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(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”)