Java 如何使用多线程运行spring集成
我想用spring集成做以下工作Java 如何使用多线程运行spring集成,java,spring,spring-integration,spring-integration-sftp,Java,Spring,Spring Integration,Spring Integration Sftp,我想用spring集成做以下工作 从sftp获取文件 将下载的文件发送到http和s3 这是我到目前为止所拥有的 @Bean @InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(fixedDelay = "100000", maxMessagesPerPoll = "3")) public MessageSource<File> sftpMessageSource() { SftpI
@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;
}
如何在单独的线程上运行文件进程并释放轮询器线程,以便轮询器可以继续从sftp中提取文件?您可以使用
@Async
注释在单独的线程中运行任何方法。您只需在任何@Configuration
文件中添加@EnableAsync
,当您调用它时,它将异步运行。您可以在这里找到更多信息。您可以使用@Async
注释在单独的线程中运行任何方法。您只需在任何@Configuration
文件中添加@EnableAsync
,当您调用它时,它将异步运行。您可以在这里找到更多信息。类似以下内容:
@Bean
public ThreadPoolTaskExecutor executor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setMaxPoolSize(5);
return executor;
}
并在@InboundChannelAdapter
的@Poller
中使用该executor
作为bean名称:
@Bean
@InboundChannelAdapter(channel = "sftpChannel",
poller = @Poller(fixedDelay = "100000", maxMessagesPerPoll = "3", taskExecutor="executor"))
请参见@Poller
JavaDocs:
/**
* @return The {@link org.springframework.core.task.TaskExecutor} bean name.
*/
String taskExecutor() default "";
另请参见参考手册中的文档:
重要提示:异步切换
此建议基于receive()
结果修改触发器。只有在轮询器线程上调用通知时,这才有效。如果轮询器有任务执行器
,则它将不起作用。若要在轮询结果之后使用异步操作时使用此建议,请稍后使用执行器通道执行异步切换
大概是这样的:
@Bean
public ThreadPoolTaskExecutor executor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setMaxPoolSize(5);
return executor;
}
并在@InboundChannelAdapter
的@Poller
中使用该executor
作为bean名称:
@Bean
@InboundChannelAdapter(channel = "sftpChannel",
poller = @Poller(fixedDelay = "100000", maxMessagesPerPoll = "3", taskExecutor="executor"))
请参见@Poller
JavaDocs:
/**
* @return The {@link org.springframework.core.task.TaskExecutor} bean name.
*/
String taskExecutor() default "";
另请参见参考手册中的文档:
重要提示:异步切换
此建议基于receive()
结果修改触发器。只有在轮询器线程上调用通知时,这才有效。如果轮询器有任务执行器
,则它将不起作用。若要在轮询结果之后使用异步操作时使用此建议,请稍后使用执行器通道执行异步切换
@Poller
接受您可以配置为异步运行的taskExecutor
。请将您的评论作为答案。这是非常正确的。谢谢@tsolakp。在taskExecutor中,我是否只执行任务?但是我该如何配置线程呢<代码>ThreadPoolTaskExecutor executor=新的ThreadPoolTaskExecutor();执行器setMaxPoolSize(5)代码>例如:pool.execute(()->进程(有效负载,时间戳),1000
你有一个示例吗?我没有示例,但@Artem Bilan的这篇文章可能会有所帮助:@Poller
使用taskExecutor
,你可以将其配置为异步运行。请将你的评论作为答案。这是非常正确的。谢谢@tsolakp。在taskExecutor中,我是否只执行任务?但是我该如何配置线程呢<代码>ThreadPoolTaskExecutor executor=新的ThreadPoolTaskExecutor();执行器setMaxPoolSize(5)代码>例如:pool.execute(()->进程(有效负载,时间戳),1000代码>你有样本吗?我没有示例,但@Artem Bilan的这篇文章可能会有所帮助:我尝试了你的示例,但轮询器似乎只在一个线程上运行:'(ThreadPoolTaskExecutor-executor
在task1Poller上继续运行-true,因为您使用的是固定延迟,因此新任务在当前时间加上100000毫秒后才能开始。另一方面,您应该并行处理3条消息。可能我不理解此入站通道。因此轮询器是just从sftp中提取文件,对吗?它一次提取2个文件。因此,在这种情况下,我应该为service activator创建另一个线程,以便我可以处理我的文件(发送到http和S3)当轮询器将它们拉到不同的线程上时,我想你需要考虑使用一个执行代码< <代码> PuxSudiScript频道> /Cult>作为并行执行器,那些HTTP和S3作为订阅服务器尝试了你的例子,但是Payor似乎只在1个线程上运行:(ThreadPoolTaskExecutor-executor
在task1Poller上继续运行-true,因为您使用的是固定延迟,因此新任务在当前时间加上100000毫秒后才能开始。另一方面,您应该并行处理3条消息。可能我不理解此入站通道。因此轮询器是just从sftp中提取文件,对吗?它一次提取2个文件。因此,在这种情况下,我应该为service activator创建另一个线程,以便我可以处理我的文件(发送到http和S3)当轮询器将它们拉到不同的线程上时,我想您需要考虑使用一个执行代码> <代码> PuxSudiScript通道>代码>,以执行并行性,而那些HTTP和S3作为订阅服务器。