Я новичок в Spring Framework и, действительно, я изучаю и использую Spring Boot. Недавно, в приложении, которое я разрабатываю, я сделал работу Quartz Scheduler, и теперь я хочу сделать интеграцию с Spring: 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;
}
}
Следующий класс, который я назвал его как FtpGateway, выглядит следующим образом:
@Component
public class FtpGateway {
@Autowired
private DefaultFtpsSessionFactory sess;
public void sendFile(){
// todo
}
public void readFile(){
// todo
}
}
Я читаю эту документацию, чтобы научиться этому. Spring Integration FTP, по-видимому, управляется событиями, поэтому я не знаю, как я могу выполнить любой из sendFile() и readFile() с помощью дескрипторов, когда триггер запускается в точное время.
Документация говорит мне что-то об использовании Inbound Channel Adapter (для чтения файлов с FTP?), Outbound Channel Adapter (для записи файлов на FTP?) И Outbound Gateway (для чего?):
Spring Integration поддерживает отправку и получение файлов по FTP/FTPS путем предоставления трех конечных точек клиентской стороны: адаптера входящего канала, адаптера исходящего канала и исходящего шлюза. Он также предоставляет удобные параметры конфигурации на основе пространства имен для определения этих компонентов клиента.
Итак, я не понимаю, как следовать.
Пожалуйста, может кто-нибудь дать мне подсказку?
Спасибо!
EDIT:
Спасибо @M. Deinum. Во-первых, я попробую простую задачу: прочитайте файл с FTP, poller будет запускаться каждые 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 intro "Entrada" удаленной папке, но метод handler() не запускается через 5 секунд... Я делаю что-то неправильно?