java - 如何使用camel将文件从源复制到目标

标签 java apache apache-camel scp

我们有一个要求,需要将文件从源复制到目标(与源不同的系统)。我们需要使用 apache Camel 。

我没有找到如何指定目标目录。你能帮忙吗

private void boot() throws Exception {
        Main main = new Main();
        main.addRouteBuilder(new RouteBuilder() {
            String sourceDirectory = "D:\\vsinv-conf";
            String server = "xxx-yyy-host:/var/log/index/";
            String user = "admin";
            String password = "password";
            public void configure() {
                from("timer:loadingApplicationList?repeatCount=1").routeId("loadApplicationList").to("direct:start");
                from("direct:start").from("file://" + sourceDirectory).to("scp://" + server + "?username=" + user
                        + "&password=" + password + "&useUserKnownHostsFile=false");
            }
        });

        main.run();
    }

给出以下异常

java.lang.NullPointerException
    at com.jcraft.jsch.Util.checkTilde(Util.java:489)
    at com.jcraft.jsch.KnownHosts.setKnownHosts(KnownHosts.java:53)
    at com.jcraft.jsch.JSch.setKnownHosts(JSch.java:317)
    at org.apache.camel.component.scp.ScpOperations.createSession(ScpOperations.java:239)
    at org.apache.camel.component.scp.ScpOperations.connect(ScpOperations.java:179)
    at org.apache.camel.component.file.remote.RemoteFileProducer.connectIfNecessary(RemoteFileProducer.java:209)
    at org.apache.camel.component.file.remote.RemoteFileProducer.recoverableConnectIfNecessary(RemoteFileProducer.java:201)
    at org.apache.camel.component.file.remote.RemoteFileProducer.preWriteCheck(RemoteFileProducer.java:133)
    at org.apache.camel.component.file.GenericFileProducer.processExchange(GenericFileProducer.java:113)
    at org.apache.camel.component.file.remote.RemoteFileProducer.process(RemoteFileProducer.java:58)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:173)
    at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:341)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:168)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:468)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:196)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:196)
    at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:454)
    at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:226)
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:190)
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:175)
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:102)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
2017-08-24 16:29:05 WARN  ScpProducer:86 - Writing file failed with: null

最佳答案

我知道您正在尝试从文件复制到 SCP。

所以,从 Jsch component ,我相信您有两种方法可以实现这一目标:

You can append query options to the URI in the following format, ?option=value&option=value&... The file name can be specified either in the part of the URI or as a "CamelFileName" header on the message (Exchange.FILE_NAME if used in code).

这意味着您可以使用:

to("scp://yourhost/folder1/folder2/youfile.txt?options..")

或者您可以尝试 Exchange.FILE_NAME(尽管我不知道它是否允许您设置目录或仅设置文件名:

from("direct:start")
.setHeader(Exchange.FILE_NAME, constant("folder1/folder2/youfile.txt"))
.to("scp://host?options...");

关于java - 如何使用camel将文件从源复制到目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45860011/

相关文章:

Java邮件API连接存储在本地服务器但未连接到开发服务器

java - 我应该在线程上拆分 Tcp 客户端实现吗?

php - Laravel:PDOException:找不到驱动程序

java - 包 org.apache.hadoop.ipc.protobuf 为空

apache-camel - 如何在 Apache Camel 中通过 JMS 队列传递 POJO

java - Apache Camel 合并来自不同路径的两个文件

java - 如何在 android L 上加载 OpenCV 时删除日志记录语句

java - 如何纠正 java 中的 For Each 循环(最终测试的输出不正确)?

c - Apache 服务器中的全局变量

apache-camel - 如何使用 Camel 食谱列表