多线程@Scheduled Springboot

时间:2017-01-27 16:58:29

标签: java multithreading spring-boot

我现在正在使用@scheduled和threadPoolTask​​Scheduler运行一个应用程序。

我的配置类:

@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方法设置一个线程池。你能帮助我吗?

感谢。

1 个答案:

答案 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次。他们没事。

您的配置不是他们的问题,您可以根据需要配置您的线程池。