如何使用多线程运行Spring集成

时间:2018-11-07 21:49:05

标签: java spring spring-integration spring-integration-sftp

我想对Spring集成进行以下操作

  1. 从sftp获取文件
  2. 将下载的文件发送到http以及s3

这是我到目前为止所拥有的。

@Bean
@InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(fixedDelay = "100000", maxMessagesPerPoll = "3"))
    public MessageSource<File> sftpMessageSource() {
        SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer());
        source.setLocalDirectory(new File("sftp-inbound"));
        source.setAutoCreateLocalDirectory(true);
        source.setMaxFetchSize(2);
        return source;
    }

这是我的服务激活器。 我的服务激活器的问题在于,它与轮询器在同一线程中运行,因此当文件处理时间过长时,直到第一个完成后,它才处理下一个。

@ServiceActivator(inputChannel = "sftpChannel")
        public void sftpChannel(@Payload File payload, @Header("timestamp") long timestamp) {
            log.info("Message arrived at sftpChannel");
         //do something with file
    }

如何在单独的线程上运行文件进程并改为释放轮询程序线程,以便轮询程序可以继续从sftp提取文件?

2 个答案:

答案 0 :(得分:1)

您可以使用@Async批注在单独的线程中运行任何方法。您只需要在任何@EnableAsync文件中添加@Configuration,当您调用它时,它将异步运行。您可以在此blog中找到更多信息。

答案 1 :(得分:1)

类似这样的东西:

@Bean
public ThreadPoolTaskExecutor executor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setMaxPoolSize(5);
    return executor; 
}

并使用executor作为@Poller的{​​{1}}中的bean名称:

@InboundChannelAdapter

请参见@Bean @InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(fixedDelay = "100000", maxMessagesPerPoll = "3", taskExecutor="executor")) JavaDocs:

@Poller

另请参阅参考手册中的文档:https://docs.spring.io/spring-integration/docs/5.0.9.RELEASE/reference/html/messaging-channels-section.html#conditional-pollers

  

重要:异步切换

     

此建议根据/** * @return The {@link org.springframework.core.task.TaskExecutor} bean name. */ String taskExecutor() default ""; 结果修改触发器。仅当在轮询线程上调用建议时,这才起作用。如果轮询器具有receive(),则它将不起作用。要在轮询结果之后希望使用异步操作的地方使用此建议,请稍后使用a task-executor进行异步切换。