我现在正在使用@scheduled和threadPoolTaskScheduler运行一个应用程序。
我的配置类:
@Configuration
@EnableScheduling
public class AppConfig {
@Bean(destroyMethod = "shutdown")
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);
return taskScheduler;
}
}
我的任务:
@Scheduled(fixedRate = 5000)
public void execute() {
//do stuff
//call a webservice
}
在execute方法中,我做了一些事情并调用外部Web服务,这个web服务有一个限制,我不能使用每个webservice调用10个以上的线程。现在我需要创建另外3个方法,比如执行(并为每个方法进行一次外部webservice调用"执行"方法)。
所以我总共可以使用40个线程,但每个方法限制为10个。
我想知道是否有某种方法可以为每个@scheduled方法设置一个线程池。你能帮助我吗?
感谢。
答案 0 :(得分:0)
如果您愿意,可以使用多个池,但您必须根据此问题的答案手动安排任务:
Why does Spring 4 only allow one TaskScheduler in a context?
但是,我不明白为什么你需要这么多线程来调用Web服务。
修改
澄清后:
您可以在不同的线程中调用Web服务来创建bean:
@Bean
public class WebServiceCaller {
@Async
public void callWebService() {
//call your web service here
}
}
在调用者类中(重要的是在另一个类中使autoproxy工作)。
@Bean
public class Caller {
@Autowired
private WebServiceCaller caller;
public void callWith10Threads() {
for (int i = 0; i < 10; i++) {
caller.callWebService();
}
}
}
不要忘记使用@EnableAsync注释您的配置。
这里的关键点是,他们不知道你在池中有多少线程或者其他什么,他们只知道你发送了多少请求(线程在他们一边)。因此,使用不同的线程连续调用10次,不要调用11次。他们没事。
您的配置不是他们的问题,您可以根据需要配置您的线程池。