Spring Boot에서 FTP로 파일 보내기 및 받기
저는 Spring Framework를 처음 사용하고 있으며, 실제로 Spring Boot를 배우고 사용하고 있습니다.최근에 제가 개발하고 있는 앱에서 Quartz Scheduler를 작동시켰는데, 이제는 Spring Integration을 작동시키고 싶습니다: 파일을 쓰고 읽을 서버로의 FTP 연결.
제가 원하는 것은 정말 간단합니다(이전의 Java 애플리케이션에서 가능했던 것처럼).Quartz Jobs는 매일 다른 시간에 실행되도록 예약되어 있습니다. 하나는 FTP 서버에서 파일을 읽고 다른 하나는 FTP 서버에 파일을 씁니다.
제가 지금까지 개발한 것을 자세히 설명하겠습니다.
@SpringBootApplication
@ImportResource("classpath:ws-config.xml")
@EnableIntegration
@EnableScheduling
public class MyApp extends SpringBootServletInitializer {
@Autowired
private Configuration configuration;
//...
@Bean
public DefaultFtpsSessionFactory myFtpsSessionFactory(){
DefaultFtpsSessionFactory sess = new DefaultFtpsSessionFactory();
Ftp ftp = configuration.getFtp();
sess.setHost(ftp.getServer());
sess.setPort(ftp.getPort());
sess.setUsername(ftp.getUsername());
sess.setPassword(ftp.getPassword());
return sess;
}
}
다음 클래스는 Ftp Gateway로 명명했습니다. 다음과 같습니다.
@Component
public class FtpGateway {
@Autowired
private DefaultFtpsSessionFactory sess;
public void sendFile(){
// todo
}
public void readFile(){
// todo
}
}
저는 그렇게 하는 법을 배우기 위해 이 문서를 읽고 있습니다.Spring Integration의 FTP는 이벤트 기반인 것 같아서 트리거가 정확한 시간에 실행될 때 Jobs에서 sendFile()과 readFile() 중 하나를 어떻게 실행할 수 있는지 모르겠습니다.
설명서에서는 인바운드 채널 어댑터(FTP에서 파일 읽기?), 아웃바운드 채널 어댑터(FTP에 파일 쓰기?) 및 아웃바운드 게이트웨이(무엇을 위해?)를 사용하는 방법에 대해 설명합니다.
Spring Integration은 세 가지 클라이언트 측 끝점을 제공하여 FTP/FTPS를 통한 파일 송수신을 지원합니다.인바운드 채널 어댑터, 아웃바운드 채널 어댑터 및 아웃바운드 게이트웨이.또한 이러한 클라이언트 구성요소를 정의하기 위한 편리한 네임스페이스 기반 구성 옵션을 제공합니다.
그래서 어떻게 해야 할지 아직 확실하게 모르겠어요.
누가 힌트 좀 주시겠어요?
감사해요!
편집:
@M 감사합니다.데이넘.먼저 간단한 작업을 시도해 보겠습니다. FTP에서 파일을 읽어보면 폴러가 5초마다 실행됩니다.제가 추가한 내용은 다음과 같습니다.
@Bean
public FtpInboundFileSynchronizer ftpInboundFileSynchronizer() {
FtpInboundFileSynchronizer fileSynchronizer = new FtpInboundFileSynchronizer(myFtpsSessionFactory());
fileSynchronizer.setDeleteRemoteFiles(false);
fileSynchronizer.setPreserveTimestamp(true);
fileSynchronizer.setRemoteDirectory("/Entrada");
fileSynchronizer.setFilter(new FtpSimplePatternFileListFilter("*.csv"));
return fileSynchronizer;
}
@Bean
@InboundChannelAdapter(channel = "ftpChannel", poller = @Poller(fixedDelay = "5000"))
public MessageSource<File> ftpMessageSource() {
FtpInboundFileSynchronizingMessageSource source = new FtpInboundFileSynchronizingMessageSource(inbound);
source.setLocalDirectory(new File(configuracion.getDirFicherosDescargados()));
source.setAutoCreateLocalDirectory(true);
source.setLocalFilter(new AcceptOnceFileListFilter<File>());
return source;
}
@Bean
@ServiceActivator(inputChannel = "ftpChannel")
public MessageHandler handler() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
Object payload = message.getPayload();
if(payload instanceof File){
File f = (File) payload;
System.out.println(f.getName());
}else{
System.out.println(message.getPayload());
}
}
};
}
그런 다음 앱이 실행 중일 때 새 csv 파일 인트로 "Entrada" 원격 폴더를 넣었지만 핸들러() 메서드는 5초 후에 실행되지 않습니다...내가 뭘 잘못했나요?
폴러 메서드에 @Scheduled(fixedDelay = 5000)를 추가하십시오.
태슬릿과 함께 SPRING BATCH를 사용해야 합니다.스프링에서 제공하는 기존 인터페이스로 빈 크론 시간 입력 소스를 구성하는 것이 훨씬 쉽습니다.
https://www.baeldung.com/introduction-to-spring-batch
위의 예는 주석과 xml 기반 둘 다이며 둘 중 하나를 사용할 수 있습니다.
기타 이점 청취자와 병렬 단계를 사용합니다.이 프레임워크는 독서자 - 프로세서 - 작성자 방식으로도 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/42107640/send-and-receive-files-from-ftp-in-spring-boot
'programing' 카테고리의 다른 글
"Table'dbo"를 해결하려면 어떻게 해야 합니까?Foo'가 이미 존재합니다." 테이블이 존재하지 않을 때 오류가 발생합니까? (0) | 2023.07.10 |
---|---|
문자열의 첫 번째 문자 가져오기 및 제거 (0) | 2023.07.10 |
커밋 범위 git 되돌리기 (0) | 2023.07.10 |
10.4.14 버전에서 mariaDB 버전을 아는 방법 - MariaDB (0) | 2023.07.10 |
우발적인 Git Stash Pop 실행 취소 (0) | 2023.07.10 |