我是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;
}
}
以下课程将其命名为FtpGateway,如下所示:
@Component
public class FtpGateway {
@Autowired
private DefaultFtpsSessionFactory sess;
public void sendFile(){
// todo
}
public void readFile(){
// todo
}
}
我正在阅读this文档以了解相关信息。 Spring Integration的FTP似乎是事件驱动的,所以我不知道如何在确切的时间触发触发器时由Jobs执行sendFile()和readFile()。
文档告诉我something关于使用入站通道适配器(从FTP读取文件?),出站通道适配器(将文件写入FTP?)和出站网关(做什么?):< / p>
Spring Integration支持通过FTP / FTPS发送和接收文件,方法是提供三个客户端端点:入站通道适配器,出站通道适配器和出站网关。它还提供了方便的基于命名空间的配置选项,用于定义这些客户端组件。
所以,我还没有明白如何遵循。
拜托,有人可以给我一个暗示吗?
谢谢!
修改:
谢谢@M。 Deinum。首先,我将尝试一个简单的任务:从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文件介绍&#34; Entrada&#34;远程文件夹,但handler()方法在5秒后没有运行......我做错了什么?
答案 0 :(得分:0)
请在您的轮询器方法上添加 @Scheduled(fixedDelay = 5000)。
答案 1 :(得分:0)
您应该对Tasklet使用 SPRING BATCH 。使用Spring提供的现有接口来配置bean,时间,输入源要容易得多。
https://www.baeldung.com/introduction-to-spring-batch
上面的示例是基于注释和xml的,您都可以使用。
其他好处:利用听众和并行步骤。该框架也可以以Reader-Processor-Writer的方式使用。