0
点赞
收藏
分享

微信扫一扫

Spring定时任务(串行/并行)以及异步任务

向上的萝卜白菜 2021-09-28 阅读 95

一。Spring提供了两种调度任务的方式。

调度任务,@Scheduled
异步任务,@Async

1,定时任务单线程执行的时间问题。

@Component
public class TestTask {

    @Scheduled(fixedRate = 1000 * 10)   //每10秒执行一次
    public void aTask(){
        try {
            TimeUnit.SECONDS.sleep(20);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(DateTime.now().toDate())+"*********A任务每10秒执行一次进入测试");
    }

}

@Component
public class TestTask2 {
    @Scheduled(fixedRate = 5000)   //每5秒执行一次
    public void bTask(){
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(sdf.format(DateTime.now().toDate())+"*********B任务每5秒执行一次进入测试");
    }

}
@Configuration
@EnableAsync
@EnableScheduling
public class AppConfig {
}

@Configuration//配置定时任务的线程池,支持定时任务并行处理
public class ScheduleConfig implements SchedulingConfigurer {
 
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
    }
 
    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(100);
    }
}

@Configuration   
public class AsyncConfig implements AsyncConfigurer {     
    @Override  
    public Executor getAsyncExecutor() {  
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  
        executor.setCorePoolSize(7);  
        executor.setMaxPoolSize(42);  
        executor.setQueueCapacity(11);  
        executor.setThreadNamePrefix("MyExecutor-");  
        executor.initialize();  
        return executor;  
    }  
       
    @Override  
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {  
         return new MyAsyncUncaughtExceptionHandler();  
    }  
} 

二,用法解释

1,@Scheduled注解,添加到方法上,周期性的调用该方法

简单的周期性的任务simple periodic scheduling
@Scheduled(initialDelay=1000, fixedRate=5000)
public void doSomething() {
    // something that should execute periodically
}
@Scheduled(fixedDelay=5000)
public void doSomething() {
    // something that should execute periodically
}
@Scheduled(fixedRate=5000)
public void doSomething() {
    // something that should execute periodically
}

2,cron表达式。

@Scheduled(cron="*/5 * * * * MON-FRI")
public void doSomething() {
    // something that should execute on weekdays only
}

三,配置定时任务的线程池。

public class AppConfig implements SchedulingConfigurer{
@Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        logger.info("Configure task registor: {}", taskRegistrar);
        taskRegistrar.setScheduler(taskExecutor());
    }

    @Bean(destroyMethod="shutdown")
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(20);
    }
}
举报

相关推荐

0 条评论