Я использую inbound-channel-adapter
из Spring Integration для извлечения файлов через sftp с удаленного сервера. Все работает нормально. Но у меня есть дополнительное требование: после получения файла на локальной стороне этот файл необходимо перенести в каталог «отправить» на удаленном сервере.Spring integration sftp move remote file issue
«SFTP Outbound Gateway» имеет соответствующий метод для этого move действие, но моя проблема в том, когда его называть.
Ситуация: 10 файлов на удаленном сервере, 0 на локальном сервере Когда я запустил приложение, он получит все 10 файлов с удаленного сервера и напишет их в мою локальную файловую систему. Отлично.
Ситуация: 1 файл на удаленном сервере, 10 на локальном сервере В этой ситуации удаленный файл получен, но для каждого файла в локальной файловой системе также вызывается метод приема QueueChannel. Пример входа из одного файла: (file1.zip)
18:12:52.118 [task-scheduler-1] INFO o.s.i.file.FileReadingMessageSource - Created message: [[Payload File content=C:\Downloads\sftpTest\file1.zip][Headers=...]
18:12:52.119 [task-scheduler-1] DEBUG o.s.i.e.SourcePollingChannelAdapter - Poll resulted in Message: [Payload File content=C:\Downloads\sftpTest\file1.zip][Headers=...]
18:12:52.119 [task-scheduler-1] DEBUG o.s.integration.channel.QueueChannel - preSend on channel 'fromChannel', message: [Payload File content=C:\Downloads\sftpTest\file1.zip][...]
18:12:52.119 [task-scheduler-1] DEBUG o.s.integration.channel.QueueChannel - postSend (sent=true) on channel 'fromChannel', message: [Payload File content=C:\Downloads\sftpTest\file1.zip][Headers=...]
18:12:52.119 [main] DEBUG o.s.integration.channel.QueueChannel - postReceive on channel 'fromChannel', message: [Payload File content=C:\Downloads\sftpTest\file1.zip][Headers=......]
Таким образом, даже если файл не physicaly полученное из удаленного сервера, метод channel.receive()
все равно будет получать сообщение с этим файлом в качестве полезной нагрузки. Это меня смущает, потому что я не могу определить из сообщения, был ли файл уже включен в локальную файловую систему или был просто извлечен с удаленного сервера. Я экспериментировал с использованием пользовательских org.springframework.messaging.support.ChannelInterceptorAdapter
, FileFilter
, ServiceActivator
, но проблема все еще остается.
Мое приложение обрабатывает большие объемы, поэтому отправка полученного файла в требуемый каталог на удаленном сервере не является вариантом. А также просто попытка переместить удаленный файл для каждого сообщения, которое получено локально, не является опцией, так как оно загромождает лог-файлы с исключениями из-за невозможности перемещения файла. Таким образом, в случае возникновения реальной ошибки проблема не будет обнаружена.
Одним из решений может быть крючок по методу copyFileToLocalDirectory
of org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer
. Выполняется проверка, если удаленный файл должен быть удален, и этот цикл вызывается только для файлов, которые были фактически переданы с удаленного сервера. Мои попытки переопределить этот метод и добавить мое поведение перемещения не удалось, так как Spring уже создала классы , которые будут обрабатывать это.
Итак, что является лучшим способом достичь этого? Я знаю, что проблема, вероятно, будет расположена между моей клавиатурой и моим стулом, но у меня заканчиваются варианты, и любая помощь очень ценится.
Спасибо большое,
Frank
Поделитесь вашей конфигурацией, пожалуйста –