2014-09-03 4 views
2

스프링 통합에서 inbound-channel-adapter을 사용하여 원격 서버에서 sftp를 통해 파일을 검색합니다. 모든 것이 잘 작동합니다. 하지만 추가 요구 사항이 있습니다. 로컬 쪽에서 파일을받은 후에는 해당 파일을 원격 서버의 "보내기"디렉터리로 이동해야합니다.스프링 통합 sftp 원격 파일 문제 이동

"SFTP 아웃 바운드 게이트웨이"에는 동작 동작에 대한 적절한 방법이 있지만 문제는 언제 호출할까요?

상황 : 원격 서버에 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 메소드의 한 가지 해결 방법이있을 수 있습니다. 원격 파일을 삭제해야하고 루프가 원격 서버에서 실제로 전송 된 파일에 대해서만 호출되는 경우 검사가 수행됩니다. Spring이 이미 이것을 처리 할 클래스 을 인스턴스화했기 때문에이 메서드를 무시하고 내 이동 동작을 추가하려는 나의 시도는 성공하지 못했습니다.

그래서 이것을 달성하는 가장 좋은 방법은 무엇입니까? 나는 문제가 아마도 내 키보드와 의자 사이에있을 것이라는 것을 알고 있지만 옵션이 없어 졌기 때문에 도움을받을 수 있습니다.

고마워,

프랭크

+0

구성을 공유하십시오. –

답변

1

당신은 아마 파일을 검색 할 수 MGET 및 아웃 바운드 게이트웨이를 사용하는 대신 당신이 말한대로,이 단계는 인바운드 어댑터를 사용하여 더 나을 것 - (영구 파일 목록 필터를 사용하는 경우가 아니라면 "새"파일 만 표시됨) 로컬 디스크의 파일에 대한 메시지를 생성, 동기화 및 전송할 수 있습니다.

+0

안녕하세요 게리, 고맙습니다. 그것이 의미가 있습니다. SFTP Outbound Gateway의 MGET을 사용하도록 코드를 변경하겠습니다. 감사합니다, 프랭크 – Frank