저는 스프링 통합을 처음 사용합니다. 먼저/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);
}
}
내가 어떤 조언이나 제안을 주셔서 감사합니다를 작성한 코드입니다. 감사합니다. .
아르 템 빌란 내가 여기에 포인트를 참조하십시오. 따라서 SftpOutboundGateway를 사용하여/files 폴더에서/process 폴더로 파일을 이동하는 것이 좋습니다. 내 쿼리는 먼저 @InboundChannelAdapter 을 사용하여/file에서 파일을 선택한 다음 SftpOutboundGateway를 원하는 위치 (예 :/process)로 이동합니다. 이제/process에서 로컬로 해당 파일을 복사하려고합니다. 어떻게 될까요? 필자가 작성한 코드를 추가하고 있습니다. 이동 된 파일을/process에서 로컬로 복사하려면 어떤 변경을해야하는지 살펴보십시오. –
지금까지 코드에 문제가 표시되지 않았습니다. 그러나 만약 당신이 로컬'/ files' 디렉토리에 대해 이야기한다면, 네,'FileReadingMessageSource'를 사용하고'SftpMessageHandler'를 통해 원격'/ process'에 로컬 파일을 보내야합니다. 반대편에서는'SftpInboundFileSynchronizingMessageSource'를 사용하여'/ process'에서 로컬 디렉토리로 원격 파일을 폴링 할 수 있습니다.그렇지 않으면, 제발, 귀하의 요구 사항을 바꿔서 그냥 내 작업을 이해하지 못하는이 내 의견을 고려하십시오 –
안녕하세요, artem 다시 설명하려고하자. sftp에/initial과/final이라는 두 개의 폴더가 있고 local caller/local에 하나의 폴더가 있다고 가정하십시오. 이제/initial에서/final로 파일을 이동해야합니다. 그리고 그 파일을/final에서/local로 복사하십시오. 이게 당신이 문제를 더 잘 이해하는 데 도움이되기를 바랍니다. 지금 장소에서 요구 사항은 위의 코드가 정확하다고 생각합니다. –