0

저는 스프링 통합을 처음 사용합니다. 먼저/files 폴더에서 SFTP 위치의/process 폴더로 파일을 이동 한 다음 해당 파일을 로컬로 복사해야합니다. 게이트웨이를 사용하도록 제안되었으며 구성은 Java를 사용하여 주석을 사용해야합니다. 나는 stackoverflow에 대한 답변을 찾고 여기 시도했지만 관련성이 뭔가를 찾을 수 없습니다. 그러나 @InboundChannelAdapter를 사용하여 파일을 복사하고 다른 빈을 구성 할 수있었습니다. 다음은 스프링 통합에서 자바 설정을 사용하여 SFTP에서 파일 복사 및 이동

는 지금까지

구성을 공용 클래스 SftpConfiguration {

@Value("${ftp.file.host}") 
private String host; 

@Value("${ftp.file.port") 
private int port; 

@Value("${ftp.file.user") 
private String user; 

@Value("${ftp.file.password") 
private String password; 

@Value("${directorry.file.remote") 
private String remoteDir; 

@Value("${directorry.file.in.pollerDelay") 
final private String pollerDelay = "1000"; 

@Value("${directory.file.remote.move}") 
private String toMoveDirectory; 

@Bean 
public SessionFactory<LsEntry> sftpSessionFactory() { 
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true); 
    factory.setHost(host); 
    factory.setPort(port); 
    factory.setUser(user); 
    factory.setPassword(password); 
    factory.setAllowUnknownKeys(true); 
    return new CachingSessionFactory<LsEntry>(factory); 
} 

@Bean 
public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() { 
    SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory()); 
    fileSynchronizer.setDeleteRemoteFiles(false); 
    fileSynchronizer.setRemoteDirectory(remoteDir); 
    fileSynchronizer.setFilter(new SftpSimplePatternFileListFilter("*.xlsx")); 
    return fileSynchronizer; 
} 

@Bean 
@InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(fixedDelay = pollerDelay)) 
public MessageSource<File> sftpMessageSource() { 
    SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(
      sftpInboundFileSynchronizer()); 
    source.setLocalDirectory(new File("ftp-inbound")); 
    source.setAutoCreateLocalDirectory(true); 
    source.setLocalFilter(new AcceptOnceFileListFilter<File>()); 

    return source; 
} 

@Bean 
@ServiceActivator(inputChannel = "sftpChannel") 
public MessageHandler handler() { 
    return new MessageHandler() { 

     @Override 
     public void handleMessage(Message<?> message) throws MessagingException { 
      try { 
       new FtpOrderRequestHandler().handle((File) message.getPayload()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

    }; 
} 

@Bean 
@ServiceActivator(inputChannel = "sftpChannel") 
public MessageHandler handlerOut() { 
    return new SftpOutboundGateway(sftpSessionFactory(), "mv", toMoveDirectory); 
} 

}

내가 어떤 조언이나 제안을 주셔서 감사합니다를 작성한 코드입니다. 감사합니다. .

답변

0

오른쪽, 당신은 로컬 디렉토리에 원격 /process 폴더에서 파일을 다운로드 할 수 SftpInboundFileSynchronizingMessageSource에 대한 @InboundChannelAdapter@Bean를 사용해야합니다. 이는 폴러 단위로 수행되며 별도의 프로세스로 이동 작업과는 완전히 관련이 없습니다. 즉, 이동 로직 당신은 MV 명령을 FtpOutboundGateway을 통해 수행 할 수 있습니다

MV 명령은 옵션이 없습니다.

속성은 "에서"경로와 바꾸기 표현을 정의 속성이 "행"의 경로를 정의한다. 기본적으로 이름 바꾸기 식headers['file_renameTo']입니다. 이 표현식은 null로 평가되거나 비어있는 String이 아니어야합니다. 필요한 경우 필요한 원격 디렉토리가 만들어집니다. 결과 메시지의 페이로드는 Boolean.TRUE입니다. 원본 원격 디렉터리는 file_remoteDirectory 헤더에 제공되며 파일 이름은 file_remoteFile 헤더에 제공됩니다. 새 경로는 file_renameTo 헤더에 있습니다.

당신을 통해 사용해야 할이 하나

:

@Bean 
@ServiceActivator(inputChannel = "sftpChannel") 
public MessageHandler handler() { 
    return new SftpOutboundGateway(ftpSessionFactory(), "mv", "'my_remote_dir/my_file'"); 
} 
+0

아르 템 빌란 내가 여기에 포인트를 참조하십시오. 따라서 SftpOutboundGateway를 사용하여/files 폴더에서/process 폴더로 파일을 이동하는 것이 좋습니다. 내 쿼리는 먼저 @InboundChannelAdapter 을 사용하여/file에서 파일을 선택한 다음 SftpOutboundGateway를 원하는 위치 (예 :/process)로 이동합니다. 이제/process에서 로컬로 해당 파일을 복사하려고합니다. 어떻게 될까요? 필자가 작성한 코드를 추가하고 있습니다. 이동 된 파일을/process에서 로컬로 복사하려면 어떤 변경을해야하는지 살펴보십시오. –

+0

지금까지 코드에 문제가 표시되지 않았습니다. 그러나 만약 당신이 로컬'/ files' 디렉토리에 대해 이야기한다면, 네,'FileReadingMessageSource'를 사용하고'SftpMessageHandler'를 통해 원격'/ process'에 로컬 파일을 보내야합니다. 반대편에서는'SftpInboundFileSynchronizingMessageSource'를 사용하여'/ process'에서 로컬 디렉토리로 원격 파일을 폴링 할 수 있습니다.그렇지 않으면, 제발, 귀하의 요구 사항을 바꿔서 그냥 내 작업을 이해하지 못하는이 내 의견을 고려하십시오 –

+0

안녕하세요, artem 다시 설명하려고하자. sftp에/initial과/final이라는 두 개의 폴더가 있고 local caller/local에 하나의 폴더가 있다고 가정하십시오. 이제/initial에서/final로 파일을 이동해야합니다. 그리고 그 파일을/final에서/local로 복사하십시오. 이게 당신이 문제를 더 잘 이해하는 데 도움이되기를 바랍니다. 지금 장소에서 요구 사항은 위의 코드가 정확하다고 생각합니다. –

관련 문제