Верблюжий SFTP-маршрут не может продолжаться на Exception
У меня довольно простой вид трассы
sftp://hostname:22//incoming/folder/location/?username=username&password=xxxxx
&localWorkDirectory=/tmp&readLock=changed&readLockCheckInterval=2000
&move=processed/$simple{date:now:yyyy}/$simple{date:now:MM}/$simple{date:now:dd}${file:name}
&consumer.delay=450000&stepwise=false&streamDownload=true&disconnect=true
У меня также есть предложение onException
onException(ValidationException.class)
.handled(true)
.logStackTrace(true)
.filter(header("VALIDATION_ERROR").isEqualTo(true))
.choice()
.when(header("CamelFileName").contains("Param1"))
.to(sftp://hostname:22//One/error/folder?password=xxxxxx&username=username)
.when(header("CamelFileName").contains("Param2"))
.to(sftp://hostname:22//Two/error/folder?password=xxxxxx&username=username)
.endChoice();
Когда у меня есть один файл, маршрут, кажется, работает как ожидалось. Когда возникает более одного файла и возникает исключение, я получаю много разных исключений, таких как
org.apache.camel.component.file.GenericFileOperationFailedException: Cannot list directory: incoming/folder/location
Caused by: java.lang.IndexOutOfBoundsException
Я попытался использовать все атрибуты, упомянутые в маршруте, а именно. streamDownload, пошагово, readLock, localWorkDirectory и др. Однако обработка ошибок, когда несколько файлов не работает. Я вижу, как обрабатывается первый файл. Тем не менее, он не перемещается в обработанную папку, как только возникает исключение, а затем входящий / папка / местоположение становится недоступным для просмотра. Я попытался использовать продолжение (правда), а не обработано (правда)
1 ответ
Проблема была в том, что несколько файлов обрабатывались в одном обмене. В исключительных случаях маршрут пытался отправить файл ошибок по FTP на тот же сервер. Решением было разделить тело на несколько обменов, чтобы у каждого файла был свой обмен, и обрабатывать их отдельно.
from(sftp://hostname:22//incoming/folder/location/?username=username&password=xxxxx
&localWorkDirectory=/tmp&readLock=changed&disconnect=true&stepwise=false
&move=processed/$simple{date:now:yyyy}/$simple{date:now:MM}/$simple{date:now:dd}${file:name}
&consumer.delay=450000).split(body()).processRef("incomingProcessor").end();