【发布时间】:2018-11-07 21:49:05
【问题描述】:
我想通过 spring 集成做以下事情
- 从 sftp 获取文件
- 将下载的文件发送到 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 拉取文件?
【问题讨论】:
-
@Poller采用taskExecutor,您可以将其配置为异步运行。 -
请形成您的评论作为答案。这是真的。
-
感谢@tsolakp。在taskExecutor中,我是不是只执行任务?但是那我该如何配置线程呢?
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setMaxPoolSize(5);例如:pool.execute(() -> process(payload, timestamp), 1000);你有样品吗? -
我没有例子,但@Artem Bilan 的这篇文章可能会有所帮助:stackoverflow.com/questions/36169903/…
标签: java spring spring-integration spring-integration-sftp