如果作业没有完成,则spring scheduler不运行

时间:2016-10-21 15:35:25

标签: java spring scheduled-tasks

我正在尝试为我的spring应用程序创建一个lib。它有一个预定的作业,它是自动配置的,并且在大多数情况下都包含Maven依赖。

我有一个webapp,它基本上只是向其他webapps发送请求(一些基本的负载测试和失败检测)。请求者实现是完全异步的(它也有一个手动配置的异步执行器)。 Web应用程序也有定期作业,但它在2分钟的时间范围内无法可靠地完成其工作。它仍然很好。 BUT。

当我开始在第二个描述的服务器上使用我的第一个描述的lib时,lib开始工作不可靠。它不再每2分钟触发一次。我没有足够的弹簧知识来找出原因。

我最好的选择是服务器泛洪方法启动了很多异步任务,调度程序也启动了这些任务,这些请求也会转到同一个消息队列。

是否有任何方法可以将我的libs计划任务与其他服务器计划任务分开,并使它们每2分钟运行一次?

1 个答案:

答案 0 :(得分:0)

所以我的研究很有趣......似乎只有配置异步执行程序才会强制调度程序使用它。但是,如果您也实现了schedulerConfigurer,那么您将获得另一个专用于计划任务的线程池。

所以我的实现类似于2线程池。

@SpringBootApplication
@EnableAsync
@EnableScheduling
@ComponentScan
public class WebService extends AsyncConfigurerSupport implements SchedulingConfigurer {
public static void main(String[] args) {
    System.setProperty("http.proxyHost", "localhost");
    System.setProperty("http.proxyPort", "8888");
    System.setProperty("spring.config.name", "web-server");
    SpringApplication.run(WebService.class, args);
}
@Override
public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(2);
    executor.setMaxPoolSize(4);
    executor.setQueueCapacity(500);
    executor.setThreadNamePrefix("tester-");
    executor.initialize();
    return executor;
}
@Bean(destroyMethod = "shutdown", name = "scheduledExecutor")
public Executor taskExecutor() {
    return Executors.newScheduledThreadPool(100);
}

@Autowired
@Qualifier(value="scheduledExecutor")
Executor scheduledExecutor;

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    taskRegistrar.setScheduler(scheduledExecutor);
}

如果我可以为我的lib创建一个单独的线程池,还是不够清楚,但它现在已经足够好了。