Spring Boot 定时任务五 :Quartz简单封装

通过前面几篇文章可以知道,quartz的shiy使用其实就是3个步数,即

1)job - 任务- 
2)Trigger - 触发器
3)Scheduler - 任务调度

在实际项目中,一个项目里往往存在不同定时需求的任务处理,如果按照上一篇文章中的方法,那肯定是不太好的,我们可以将quartz封装成一个工具类来使用。

一、修改服务层代码

    修改上一篇使用到的UserService,新增一个方法用于另一个任务中。  

@Service
public class UserService {
	public void addUser() {
		System.out.println("**>addUser");
	}
	public void deleteUser() {
		System.out.println("**>deleteUser");
	}
}

二、创建2个定时任务Job

     1) MyJob1.java           

public class MyJob1 implements Job {
	@Autowired
	UserService userService;
	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		userService.addUser();
		System.out.println("任务1:"+new Date());
	}

}

     2) MyJob2.java 

public class MyJob2 implements Job {
	@Autowired
	UserService userService;
	
	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		userService.deleteUser(); 
		System.out.println("任务2:"+new Date());
	}
}

三、自定义AdaptableJobFactory

    沿用上一篇的MyAdaptableJobFactory.java

四、封装QuartzScheduler

这里只编写了启动任务的方法,诸如暂停、恢复、删除任务类似。

@Component
@Configuration
public class QuartzSchedulerConfig {
	@Autowired
	private Scheduler scheduler;
	@Autowired
	private MyAdaptableJobFactory myAdaptableJobFactory;

    public <E extends Job> void startJob(String name, String group,String cron,Class<E> clz) throws SchedulerException {
        // 通过JobBuilder构建JobDetail实例,JobDetail规定只能是实现Job接口的实例
        // JobDetail 是具体Job实例
        JobDetail jobDetail = JobBuilder.newJob(clz).withIdentity(name, group).build();
        // 基于表达式构建触发器
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
        // CronTrigger表达式触发器 继承于Trigger
        // TriggerBuilder 用于构建触发器实例
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(name, group)
                .withSchedule(cronScheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, cronTrigger);
        scheduler.setJobFactory(myAdaptableJobFactory);
        scheduler.start();
    }   
}

五、创建job监听器

  继承ApplicationListener,并且要将scheduler注入;

  通过代码可以看出,任务MyJob1每隔2秒执行一次,任务MyJob2每隔4秒执行一次;

@Configuration
public class QuartzStartJobListener implements ApplicationListener<ContextRefreshedEvent> {
	@Autowired
	private QuartzSchedulerConfig quartzScheduler;
	@Override
	public void onApplicationEvent(ContextRefreshedEvent arg0) {
		try {
			quartzScheduler.startJob("job1", "group1", "0/2 * * * * ?", MyJob1.class);
			quartzScheduler.startJob("job2", "group2", "0/4 * * * * ?", MyJob2.class);
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		
	}
	 /**
     * 初始注入scheduler
     * @return
     * @throws SchedulerException
     */
    @Bean
    public Scheduler scheduler() throws SchedulerException{
        SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
        return schedulerFactoryBean.getScheduler(); 
    }
}

六、运行项目

从控制台可以看出结果符合预期

猜你喜欢

转载自blog.csdn.net/zhuiyue82/article/details/87175414