Многоадресная рассылка Apache camel (ftps и файл), создающая пустой файл

Я создал маршрут верблюда (2.20.1), используя отличный DSL. Мне нужно использовать многоадресную рассылку для 2 конечных точек, а именно. ftps и файл. Если порядок маршрутов - ftps и файл, тогда файл является свойством, записанным на ftp-сервере, но в файловой системе записывается пустой файл (размером 0 байт). Если я изменил порядок, то есть файл, а затем ftps, тогда файл будет правильно записан в файловой системе, а пустой файл будет записан на ftp-сервере. Он отлично работает на FTP-сервере Apache Mina, но с клиентским ftp-сервером он работает, как указано выше.

Я пробовал оба варианта многоадресной рассылки:

.to("ftps:....").to("file:...")

а также

.to("ftps:...").to("file:..."))

Тоже пробовал parallelProcessing(), но результат тот же.

camelContext.addRoutes(new RouteBuilder() {
 def void configure() {
  from("file:///home/xyz/?fileName=file.txt&charset=utf-8&noop=true")
   .multicast()
   .to("ftps://localhost:21/files?username=anonymous&password=anonymous&binary=true&fileName=file.txt&passiveMode=true&fileExist=Fail")
   .to("file://${directory}?fileName=\${file:name}-\${date:now:yyyyMMddHHmmssSSS}")
 }
})

Я ожидаю, что многоадресная передача должна записывать один и тот же контент на обе конечные точки без потери данных.


person Murlidhar    schedule 26.06.2019    source источник


Ответы (1)


См. Почему мое сообщение пустое?. Потребитель файла возвращает InputStream, который потребляется первой конечной точкой и, таким образом, пуст для второй конечной точки. Вам необходимо включить кеширование потока или преобразовать тело в какой-либо объект многократного использования (например, String) перед многоадресной рассылкой.

Включить кеширование потока:

from("file:///home/xyz/?fileName=file.txt&charset=utf-8&noop=true")
    .streamCaching()
    .multicast()
    ...

Преобразовать тело:

from("file:///home/xyz/?fileName=file.txt&charset=utf-8&noop=true")
    .convertBodyTo(String.class)
    .multicast()
    ...
person Bedla    schedule 26.06.2019