SpringBoot整合Quartz定时任务&多定时任务

参考博客:https://blog.csdn.net/chenmingxu438521/article/details/94485695

https://blog.csdn.net/upxiaofeng/article/details/79415108#commentBox

https://blog.csdn.net/a510750/article/details/90241004

https://blog.csdn.net/qq_29145405/article/details/81843123

SpringBoot相关依赖网上太多,自己网上找

JobFactory类

用来解决quartz不能通过@Autowired注入的问题

@Component
public class JobFactory extends AdaptableJobFactory {
	/**
	 * AutowireCapableBeanFactory接口是BeanFactory的子类
	 * 可以连接和填充那些生命周期不被Spring管理的已存在的bean实例
	 */
	private AutowireCapableBeanFactory factory;
	
	public JobFactory(AutowireCapableBeanFactory factory) {
		this.factory = factory;
	}

	/**
	 * 创建Job实例
	 */
	@Override
	protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
		// 实例化对象
		Object job = super.createJobInstance(bundle);
		// 进行注入(Spring管理该Bean)
		factory.autowireBean(job);
		// 返回对象
		return job;
	}
}

SchedulerListener类

@Configuration
public class SchedulerListener implements ApplicationListener<ContextRefreshedEvent> {
	
	@Autowired
    public QuartzProvider quartzProvider;
	
	private JobFactory jobFactory;

    public SchedulerListener (JobFactory jobFactory){
        this.jobFactory = jobFactory;
    }
	
	@Override
	public void onApplicationEvent(ContextRefreshedEvent event) {
		try {
			quartzProvider.executeTasks();
        } catch (Exception e) {
            e.printStackTrace();
        }
	}
	
	@Bean
    public SchedulerFactoryBean schedulerFactoryBean(){
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setJobFactory(jobFactory);
        return schedulerFactoryBean;
    }
}

QuartzProvider类

@Component
public class QuartzProvider {
	
	// 获取到所有实现了quartzService的接口集合
	@Autowired
	private List<QuartzService> quartzServiceList;

	@Autowired
	SchedulerFactoryBean schedulerFactoryBean;

	/**
	 * @date: 2020年12月22日
	 */
	public void executeTasks() {

		if (!CollectionUtils.isEmpty(quartzServiceList)) {
			String scheduleName = "";
			String cron = "";
			// 对所有实现了quartzServiceList进行遍历,并添加定时任务
			for (int i = 0; i < quartzServiceList.size(); i++) {
				try {
					// 获取到定时任务的cron表达式与scheduleName
					scheduleName = quartzServiceList.get(i).getClass().getName();
					cron = quartzServiceList.get(i).getCron();
					
					JobDetail jobDetail = JobBuilder.newJob(quartzServiceList.get(i).getClass())
							.withIdentity(scheduleName, "group1").build();
					CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
					CronTrigger cronTrigger = getCronTrigger(scheduleBuilder, scheduleName);
					schedulerFactoryBean.getScheduler().scheduleJob(jobDetail, cronTrigger);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * 获取一个Trigger的实例,不同的定时任务,分组可以相同,实例名必须不同
	 * @date: 2020年12月22日
	 * @param scheduleBuilder
	 * @param name TriggerBuilder设置定时任务时要求每个定时任务的name不同
	 * @return
	 */
	private CronTrigger getCronTrigger(CronScheduleBuilder scheduleBuilder, String name) {
		return TriggerBuilder.newTrigger().withIdentity(name, "group1")
				.withSchedule(scheduleBuilder).build();
	}

}

定义接口QuartzService

public interface QuartzService extends Job {
	public String getCron();
}

到这里就已经完成了,编写定时任务只需要实现QuartzService接口即可

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面是测试代码

Hello类

* 这里在application.properties中的配置是 quartz.test=0/5 * * * * ?         且cron表达式在schedule使用后会置空,下面测试代码中会看到配置的配置第一次会正常打印,之后打印null

@Component
public class Hello implements QuartzService{
	
    // 这里没有写死,采用的是在配置文件中进行配置的方式,建议写成配置的方式,便于查看
	@Value("${quartz.test}")
	private String cron;
	@Override
	public String getCron() {
		System.out.println(cron);
		System.out.println("cron使用后会被置空:");
		return cron;
	}
	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		System.out.println(cron);
	}
}

MyImpl类

@Component
public class MyImpl implements QuartzService{
	@Override
	public String getCron() {
		return "0/1 * * * * ?";
	}
	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		System.out.println("bbb");
	}
}

测试效果

猜你喜欢

转载自blog.csdn.net/qq_26896085/article/details/111503943