#spring #apache-camel #camel-ftp
Вопрос:
У меня есть несколько файлов, хранящихся в базе данных, эти файлы были получены с FTP-сервера и обработаны.
Я пытаюсь переместить эти файлы в архивный каталог на FTP-сервере и для этого использую producerTemplate
.
Это то, что я делал до сих пор.
try {
DefaultCamelContext camelContext = new DefaultCamelContext();
ProducerTemplate template = camelContext.createProducerTemplate();
template.request("ftp://xxxxx/include=fileFromDb.xmlamp;move=archive/fileFromDb.xml", outExchange -> {
String body = outExchange.getIn().getBody(String.class);
});
} catch (Exception ex) {
// update the status in database to indicate archive failed
}
Но это не удается со следующей ошибкой и не может решить эту проблему.
WARN o.a.c.c.f.remote.RemoteFileProducer - Writing file failed with: Cannot write null body to file: archive/ID-192-168-1-113-tpgi-com-au-1627667653835-1-2
Я пробовал реализовывать решения из других ответов, но они не работали ни для того, ни для другого.
Если я напишу пользовательский маршрут, как показано ниже, он работает нормально, но поскольку мне нужно выполнять действия по перемещению записей, я предпочитаю использовать шаблон производителя.
from("ftp://xxxxx/include=fileFromDb.xmlamp;move=archive/fileFromDb.xml")
.log("file moved successfully").
Ответ №1:
Если я напишу пользовательский маршрут, как показано ниже, он работает нормально, но поскольку мне нужно выполнять действия по перемещению записей, я предпочитаю использовать шаблон производителя.
Вы можете использовать onCompletion для вызова другого маршрута для обработки действий после перемещения.
String sftpURI = "sftp:localhost:2222/upload"
"?username=" username "amp;password=" password
"amp;move=done";
String sftpPostMoveURI = "sftp:localhost:2222/upload/done"
"?username=" username "amp;password=" password
"amp;fileName=${headers.CamelFileName}";
from(sftpURI)
.routeId("ReadFileUsingSFTPRoute")
.onCompletion().onCompleteOnly()
.setBody().constant("")
.to("direct:postMoveActions")
.end()
.log("file ${headers.CamelFileName} moved");
from("direct:postMoveActions")
.routeId("PostMoveActionsRoute")
.log("doing post move actions!")
.pollEnrich().simple(sftpPostMoveURI).timeout(5000)
.log("File: ${body}");