在Spring Boot中从FTP发送和接收文件

时间:2017-02-08 08:01:49

标签: spring spring-boot spring-integration ftps

我是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秒后没有运行......我做错了什么?

2 个答案:

答案 0 :(得分:0)

请在您的轮询器方法上添加 @Scheduled(fixedDelay = 5000)

答案 1 :(得分:0)

您应该对Tasklet使用 SPRING BATCH 。使用Spring提供的现有接口来配置bean,时间,输入源要容易得多。

https://www.baeldung.com/introduction-to-spring-batch

上面的示例是基于注释和xml的,您都可以使用。

其他好处:利用听众和并行步骤。该框架也可以以Reader-Processor-Writer的方式使用。