Перемещение файлов в архивный каталог с помощью ftp-компонента apache camel

#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}");