Spring 调度程序不执行阻塞任务
Spring Scheduler doesn't execute for blocking tasks
我是 运行 spring 引导中的以下调度程序。 crontab 时间设置为每分钟执行该方法。然后我尝试阻止该方法 1.5 分钟。我观察到,该方法不会在第一次执行的下一分钟执行,直到循环执行 1.5 分钟。
我认为它以异步方式工作。现在很迷茫! spring 调度程序是阻塞调用吗?
@Override
@Scheduled(cron = "0 0/1 * * * ?")
//@SchedulerLock(name = "test")
public void test()
{
System.out.println("test scheduler enters:"+ LocalDateTime.now());
//LockAssert.assertLocked();
//System.out.println("now locked\n");
long st=System.currentTimeMillis();
while(true)
{
long diff=(System.currentTimeMillis()-st)/1000;
if(diff>90)
{
System.out.println("breaking time:"+(System.currentTimeMillis()-st)/1000+", timeNow:"+ LocalDateTime.now());
break;
}
}
System.out.println("Out of the loop");
}
如 spring scheduler docs 中所述,taskScheduler 默认使用单线程运行。
您可以配置多个线程,例如(取自here):
@Configuration
@EnableScheduling
public class AppConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
}
我是 运行 spring 引导中的以下调度程序。 crontab 时间设置为每分钟执行该方法。然后我尝试阻止该方法 1.5 分钟。我观察到,该方法不会在第一次执行的下一分钟执行,直到循环执行 1.5 分钟。 我认为它以异步方式工作。现在很迷茫! spring 调度程序是阻塞调用吗?
@Override
@Scheduled(cron = "0 0/1 * * * ?")
//@SchedulerLock(name = "test")
public void test()
{
System.out.println("test scheduler enters:"+ LocalDateTime.now());
//LockAssert.assertLocked();
//System.out.println("now locked\n");
long st=System.currentTimeMillis();
while(true)
{
long diff=(System.currentTimeMillis()-st)/1000;
if(diff>90)
{
System.out.println("breaking time:"+(System.currentTimeMillis()-st)/1000+", timeNow:"+ LocalDateTime.now());
break;
}
}
System.out.println("Out of the loop");
}
如 spring scheduler docs 中所述,taskScheduler 默认使用单线程运行。
您可以配置多个线程,例如(取自here):
@Configuration
@EnableScheduling
public class AppConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
}