我想对Spring集成进行以下操作
这是我到目前为止所拥有的。
@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提取文件?
答案 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
重要:异步切换
此建议根据
/** * @return The {@link org.springframework.core.task.TaskExecutor} bean name. */ String taskExecutor() default "";
结果修改触发器。仅当在轮询线程上调用建议时,这才起作用。如果轮询器具有receive()
,则它将不起作用。要在轮询结果之后希望使用异步操作的地方使用此建议,请稍后使用atask-executor
进行异步切换。