使用ssh组件启动远程scp命令时,我必须设置正文。 ssh组件使用body作为远程执行的命令。
我想要实现的目标是:
不幸的是,使用ssh要求我覆盖正文,而我正在丢失文件的内容。我试图使用inOnly,发送到另一个路由,但它不会复制文件,但可能是文件指针的副本。我无法使用wireTap,因为在完成远程执行时,路由已完成并且文件已被删除。我不能使用(我认为)一个临时变量,因为文件的大小可达到千兆字节。
我正在使用在Karaf 2.3.2下运行的Camel版本2.12.1。我正在尝试仅使用蓝图XML来尽可能避免Java编码。下面是一个样本。如果ssh组件的退出代码为非零,则结果是该文件包含我的远程命令。
<route id="RemoteTest1">
<!-- 1. Monitor for incoming files -->
<from uri="file:///data/karaf/tmp/RemoteTest1/?delete=true"/>
<!-- 2. Copy file on DMZ server -->
<to uri="sftp:username@myDmz.com//home/RemoteTest1/?privateKeyFile=myPrivateKey.pk"/>
<!-- 3. Execute scp remotely -->
<setHeader headerName="remoteCommand">
<simple>scp /home/RemoteTest1/${file:name} someuser@acme.com:${file:name}</simple>
</setHeader>
<doTry>
<inOnly uri="direct-vm:remoteExec"/>
<log message="Success"/>
<doCatch>
<exception>java.lang.Exception</exception>
<!-- 4. In case of failure rename the file by adding .failed -->
<to uri="file:?fileName=${file:absolute.path}.failed"/>
<log message="Failed"/>
</doCatch>
</doTry>
</route>
<route id="remoteExec">
<from uri="direct-vm:remoteExec"/>
<setBody>
<simple>${header.remoteCommand}</simple>
</setBody>
<to uri="ssh://username@myDmz.com?certResource=file:resources/keys/myPrivateKey.pk"/>
<!-- Throw exception on remote error -->
<choice>
<when>
<simple>${header.CamelSshExitValue} != '0'</simple>
<throwException ref="remoteExecException"/>
</when>
<otherwise>
<log message="scp completed normally"/>
</otherwise>
</choice>
</route>
<bean id="remoteExecException" class="java.lang.Exception">
<argument value="Failed remote execution" />
</bean>
有解决方案吗?任何帮助或提示将不胜感激。
由于