1.SchedulerListener 类
@Configuration
public class SchedulerListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
public TaskManager taskManager;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
try {
taskManager.executeTasks();
} catch (Exception e) {
e.printStackTrace();
}
}
@Bean
public SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
return schedulerFactoryBean;
}
}
2.TaskManager 类
/**
* 定时任务管理者
*/
@Component
public class TaskManager {
/**
* 存放所有定时任务
*/
public static final List<ScheduledJob> JOB_LIST = new ArrayList<>();
@Autowired
SchedulerFactoryBean schedulerFactoryBean;
/**
* 执行所有定时任务
*/
public void executeTasks(){
if(!CollectionUtils.isEmpty(JOB_LIST)){
for (ScheduledJob job : JOB_LIST) {
try {
//跑起来
job.startJob(schedulerFactoryBean.getScheduler());
}catch (Exception e){
e.printStackTrace();
}
}
}
}
}
3.ScheduledJob 类,所有需要运行的任务继承此抽象类即可
public abstract class ScheduledJob implements Job {
@PostConstruct
public void init(){
TaskManager.JOB_LIST.add(this);
}
/**
* cron表达式在线生成 http://cron.qqe2.com/
*
* @return
*/
public abstract String getCron();
/**
*
* @param scheduler
* 0/5 * * * * ?
* @throws SchedulerException
*/
public void startJob(Scheduler scheduler) throws SchedulerException{
JobDetail jobDetail = JobBuilder.newJob(this.getClass())
.withIdentity(this.getClass().getName() + "-job", "group1").build();
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(getCron());
CronTrigger cronTrigger = getCronTrigger(scheduleBuilder);
scheduler.scheduleJob(jobDetail,cronTrigger);
}
/**
* 若要自定义触发器,请在子类重写此方法
* @return
*/
protected CronTrigger getCronTrigger(CronScheduleBuilder scheduleBuilder){
return TriggerBuilder.newTrigger().withIdentity(this.getClass().getName() + "-trigger", "group1")
.withSchedule(scheduleBuilder).build();
}
}
4.具体job类 继承ScheduledJob,实现getCron()方法,execute()方法即可
@Component
public class Job1 extends ScheduledJob{
/**
* 五秒钟跑一次
* @return
*/
@Override
public String getCron() {
return "0/5 * * * * ?";
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("job1 is running ************************");
}
}