当前位置: 首页 > 知识库问答 >
问题:

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

鲁滨海
2023-03-14

我是Spring框架的新手,事实上,我正在学习和使用Spring Boot。最近,在我正在开发的应用程序中,我让Quartz调度器工作,现在我想让Spring集成在那里工作:FTP连接到服务器以从中写入和读取文件。

我想要的其实很简单(正如我在以前的java应用程序中所做的那样)。我计划每天在不同的时间启动两个Quartz作业:其中一个从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似乎是事件驱动的,所以我不知道当触发器在准确的时间触发时,如何从by作业执行sendFile()和readFile()。

文档介绍了如何使用入站通道适配器(从FTP读取文件?),出站通道适配器(将文件写入FTP?)和出站网关(做什么?):

Spring集成通过提供三个客户端endpoint来支持通过FTP/FTP发送和接收文件:入站通道适配器、出站通道适配器和出站网关。它还为定义这些客户机组件提供了方便的基于命名空间的html" target="_blank">配置选项。

所以,我还不清楚如何遵循。

拜托,谁能给我一个提示吗?

谢谢你!

编辑:

谢谢@M. Deina。首先,我将尝试一个简单的任务:从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文件intro“Entrada”远程文件夹,但handler()方法在5秒后不会运行。。。我做错什么了?

共有2个答案

夏星阑
2023-03-14

您应该将SPRING BATCH与tasklet一起使用。使用Spring提供的现有接口配置bean、crone time、输入源要容易得多。

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

上面的示例是基于注释和xml的,您可以使用其中任何一种。

其他好处使用侦听器和并行步骤。这个框架也可以以Reader-Procenter-Writer的方式使用。

杭涵映
2023-03-14

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

 类似资料:
  • http://Socket.io允许你触发或响应自定义的事件,除了connect,message,disconnect这些事件的名字不能使用之外,你可以触发任何自定义的事件名称。 服务器端 // 注意,io(<端口号>) 将为你创建一个http服务。 var io = require('socket.io')(80); io.on('connection', function (socket)

  • 然后我得到一个警告 在此行找到多个批注:-类型安全:未检查的从对象到ArrayList的强制转换-类型不匹配:无法从对象转换到ArrayList

  • 问题内容: 我正在尝试开发一个非常简单的客户端/服务器,其中客户端将文件转换为字节,将其发送到服务器,然后将字节转换回文件。 当前,程序仅创建一个空文件。我不是一个出色的Java开发人员,因此不胜感激。 这是接收客户端发送的内容的服务器部分。 这是客户端部分 问题答案: 在Java中复制流的正确方法如下: 希望我每次在论坛上发布时都能获得一美元。

  • 问题内容: 我是Android开发的新手,我想开发一个使用蓝牙发送和接收文本的应用程序。从逻辑上讲,我已经获得了有关发送文本的所有信息,但是当我尝试在手机中对其进行测试时,看不到该界面。 这是代码 UUID.fromString(“00001101-0000-1000-8000-00805f9b34fb”); mmSocket = mmDevice.createRfcommSocketToServ

  • 我正在尝试设置一个类来接收短信和发送状态。以下是我的清单如何查找此任务: 我收到了收到的消息,但没有收到发送的消息,我的清单声明有问题吗?

  • 通常在服务器发送一些数据时发生Message事件。服务器发送到客户端的消息可以包括纯文本消息,二进制数据或图像。无论何时发送数据,都会触发函数。 此事件充当客户端对服务器的耳朵。每当服务器发送数据时,都会触发事件。 以下代码段描述了打开Web Socket协议的连接。 还需要考虑使用Web套接字可以传输哪些类型的数据。Web套接字协议支持文本和二进制数据。就Javascript而言,文本指的是字符