Переименование файла в случае сбоя удаленного scp, запущенного компонентом Camel ssh

При использовании компонента ssh для запуска удаленной команды scp я должен указать тело. Компонент ssh использует тело в качестве команды для удаленного выполнения.

Чего я хочу добиться, так это:

  1. Папка монитора для файлов. "From" использует delete=true, так как я не хочу сохранять файлы после завершения маршрута.
  2. Скопируйте файл на DMZ-сервер, используя sftp.
  3. Запустите scp на сервере DMZ, используя ssh.
  4. В случае сбоя scp возвращает код больше 0, переименуйте файл с помощью ".failed".

К сожалению, использование ssh требует от меня перезаписи тела и потери содержимого моего файла. Я пытался использовать inOnly, отправляя по другому маршруту, но он не создает копию файла, а, вероятно, копию указателя файла. Я не могу использовать wireTap, потому что к тому времени, когда он завершает удаленное выполнение, маршрут завершен, и файл удален. Я не могу использовать (я думаю) временную переменную, потому что размер файла может достигать гигабайта.

Я использую Camel версии 2.12.1 под управлением Karaf 2.3.2. Я пытаюсь использовать 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 ответов

Другие вопросы по тегам