重命名Camel ssh组件启​​动的远程scp失败文件

时间:2014-07-02 13:01:56

标签: apache-camel apache-karaf blueprint-osgi

使用ssh组件启​​动远程scp命令时,我必须设置正文。 ssh组件使用body作为远程执行的命令。

我想要实现的目标是:

  1. 监控文件夹。 “from”使用delete = true,因为我不想在路由完成后保留文件。
  2. 使用sftp。
  3. 复制DMZ服务器上的文件
  4. 使用ssh。
  5. 在DMZ服务器上启动scp
  6. 如果失败,scp会返回大于0的代码,请使用“.failed”重命名该文件。
  7. 不幸的是,使用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>
    

    有解决方案吗?任何帮助或提示将不胜感激。

    由于

0 个答案:

没有答案