一、简述
项目中,我们可能需要从Redis、消息发送等执行异步定时任务。
二、快速上手
1、引入依赖
<!-- Quartz定时任务 --><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId></dependency><!--定时任务需要依赖context模块--><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId></dependency>
2、创建多个定时任务
@Component@EnableSchedulingpublic class NoteLikeTaskJob {public void firstJob(){System.out.println("执行定时任务1");}}@Component@EnableSchedulingpublic class CommentLikeTaskJob {public void second(){System.out.println("执行定时任务2");}}
3、创建SpringUtil工具类
@Componentpublic class SpringUtil implements ApplicationContextAware {private static ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {if (SpringUtil.applicationContext == null) {SpringUtil.applicationContext = applicationContext;}}//获取applicationContextpublic static ApplicationContext getApplicationContext() {return applicationContext;}//通过name获取 Bean.public static Object getBean(String name) {return getApplicationContext().getBean(name);}//通过class获取Bean.public static <T> T getBean(Class<T> clazz) {return getApplicationContext().getBean(clazz);}//通过name,以及Clazz返回指定的Beanpublic static <T> T getBean(String name, Class<T> clazz) {return getApplicationContext().getBean(name, clazz);}}
4、创建Quartz定时任务配置
@Configurationpublic class QuartzConfig {/*** 配置作业调度器* 可通过Trigger的个数来决定需要配置多少个触发器* @param firstTrigger 第一个定时任务触发器* @param secondTrigger 第二个定时任务触发器* @return*/@Bean(name = "scheduler")public SchedulerFactoryBean schedulerFactory(Trigger firstTrigger, Trigger secondTrigger) {SchedulerFactoryBean bean = new SchedulerFactoryBean();// 延时启动,应用启动5秒后bean.setStartupDelay(5);// 注册触发器bean.setTriggers(firstTrigger, secondTrigger);return bean;}/*** 配置定时任务1* @return*/@Bean(name = "firstJobDetail")public MethodInvokingJobDetailFactoryBean firstJobDetail() {NoteLikeTaskJob scheduledJob1 = SpringUtil.getBean(NoteLikeTaskJob.class);MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();// 是否并发执行jobDetail.setConcurrent(false);// 为需要执行的实体类对应的对象jobDetail.setTargetObject(scheduledJob1);// 需要执行的方法jobDetail.setTargetMethod("firstJob");return jobDetail;}/*** 配置定时任务1的触发器* @param firstJobDetail* @return*/@Bean(name = "firstTrigger")public CronTriggerFactoryBean firstTrigger(JobDetail firstJobDetail) {CronTriggerFactoryBean factory=new CronTriggerFactoryBean();factory.setJobDetail(firstJobDetail);factory.setCronExpression("0/5 * * * * ? *");return factory;}/*** 配置定时任务2* @return*/@Bean(name = "secondJobDetail")public MethodInvokingJobDetailFactoryBean secondJobDetail(CommentLikeTaskJob commentLikeTaskJob) {MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();/** 是否并发执行* 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,* 如果此处为true,则下一个任务会bing执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行*///jobDetail.setConcurrent(true);// 为需要执行的实体类对应的对象jobDetail.setTargetObject(commentLikeTaskJob);// 需要执行的方法jobDetail.setTargetMethod("secondJob");return jobDetail;}/*** 配置定时任务2的触发器* @param secondJobDetail* @return*/@Bean(name = "secondTrigger")public CronTriggerFactoryBean secondTrigger(JobDetail secondJobDetail) {CronTriggerFactoryBean factory=new CronTriggerFactoryBean();factory.setJobDetail(secondJobDetail);factory.setCronExpression("0/10 * * * * ? *");return factory;}}
5、修改启动类
@EnableSchedulingSpringBootApplication
