2014-09-03 4 views
2

Я использую 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

+0

Поделитесь вашей конфигурацией, пожалуйста –

ответ

1

Вы, вероятно, будет лучше использовать MGET и исходящий шлюз для извлечения файлов вместо использования входящего адаптера, который, как вы говорите, есть два этапа - синхронизировать и выделять сообщения (ы) для файлов (ов) в локальном каталоге (если вы не используете фильтр постоянных файлов, в этом случае вы увидите только «новые» файлы).

+0

Привет, Гэри, спасибо большое. Это имеет смысл, я изменю свой код на использование MGET выходного шлюза SFTP. С уважением, Фрэнк – Frank

Смежные вопросы