Переименование файла в случае сбоя удаленного scp, запущенного компонентом Camel ssh
При использовании компонента ssh для запуска удаленной команды scp я должен указать тело. Компонент ssh использует тело в качестве команды для удаленного выполнения.
Чего я хочу добиться, так это:
- Папка монитора для файлов. "From" использует delete=true, так как я не хочу сохранять файлы после завершения маршрута.
- Скопируйте файл на DMZ-сервер, используя sftp.
- Запустите scp на сервере DMZ, используя ssh.
- В случае сбоя 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>
Есть ли решение? Любая помощь или совет будут оценены.
Спасибо