配置spring定时任务


配置spring定时任务

参考项目

https://github.com/wenming5112/spring-ssm-example

定时任务依赖



    org.quartz-scheduler
    quartz
    2.2.3

注解方式配置线程池

// 启动异步调用
@EnableAsync 
public class AsyncApplicationWithAnnotation {
 
    /**
     * 自定义异步线程池
     */
 
    @Bean(name = "asyncTaskExecutor")
    public AsyncTaskExecutor taskExecutor() { 
 
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setThreadNamePrefix("Anno-Executor");
        executor.setMaxPoolSize(10);
        executor.setCorePoolSize(3);
        executor.setQueueCapacity(100);
        // 设置自定义拒绝策略
        // executor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
        //     @Override
        //     public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        //         // .....
        //         // 也可以使用默认的拒绝策略,在spring中指定策略名称
        //     }
        // });
        // 使用默认的拒绝策略,有四种
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //等待所有任务调度完成在关闭线程池,保证所有的任务被正确处理
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //线程池关闭时等待其他任务的时间,不能无限等待,确保应用最后能被关闭。而不是无限期阻塞
        executor.setAwaitTerminationSeconds(60);
        //线程池初始化
        executor.initialize();
        return executor; 
    }
 
}

xml配置线程池和定时任务

在spring.xml中配置












拒绝策略

  • ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
  • ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
  • ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
  • ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

编写异步任务


@Component
@EnableScheduling
public class ScheduledTaskExample {
 
    public ScheduledTaskExample(){
    }
 
    @Async("asyncTaskExecutor")
    @Scheduled(cron = "0/2 * * * * ?")
    //@Scheduled(fixedRate = 1000) //一秒执行一次
    public void example(){
       System.out.println("执行异步任务...");
    }

    @Async()
    @Scheduled(cron = "0/1 * * * * ?")
    //@Scheduled(fixedRate = 1000) //一秒执行一次
    public void example(){
       System.out.println("执行异步任务...");
    }
}

全局线程池

@Async()注解不指定线程池时默认使用全局线程池

@EnableAsync
@Configuration
public class AsyncGlobalConfig extends AsyncConfigurerSupport {
    private static final String THREAD_PREFIX = "defineGlobalAsync-";

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setThreadNamePrefix(THREAD_PREFIX);
        executor.setCorePoolSize(3);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(100);
        executor.setKeepAliveSeconds(60);
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setAwaitTerminationSeconds(60);
        executor.initialize();
        return executor;
    }

    //使用自定义异常处理
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new CustomAsyncExceptionHandler();
    }
}

class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

        @Override
        public void handleUncaughtException(Throwable e, Method method, Object... args) {
            //处理异常
        }
}