springboot整合querz定时调度
一:配置定时任务配置类:
@Configuration
public class QuartzConfig {
//从yml中拿出的定时任务时间戳(0 0 0 1/1 * ? * )在线的cron表达式会贴在后面
@Value("${active-schedule-express}")
private String activityScheduleExpress;
@Bean(name = "queryChargeDataJob")
public JobDetail queryActivityDataJob() {
return JobBuilder.newJob(ChargeManager.class).withIdentity("queryActivityData").storeDurably().build();
}
@Bean(name = "queryActivityDataTrigger")
public Trigger queryActivityDataTrigger() { // 0/5 * * * * ? *
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(activityScheduleExpress);
return TriggerBuilder.newTrigger().forJob(queryActivityDataJob())
.withIdentity("queryActivityData")
.withSchedule(scheduleBuilder)
.build();
}
}
二:使用quartz
1.拿出要跑的类继承QuartzJobBean,把executeInternal重写,我这里是配合ExecutorService这个线程池去跑
@Autowired
private ExecutorService executorService;
@Resource(name = "activityInfoBlockingQueue")
private BlockingQueue<ActivityInfo> activityInfoBlockingQueue;
Map<Long, Activity> rules = activityService.realRules();
for (Map.Entry<Long, ActivityRule> entry : rules.entrySet()) {
executorService.submit(new QueryInvitationRunner(entry.getValue().Id(), entry.getValue().getStartDate(),
entry.getValue().getEndDate(),
chargeService, activityInfoBlockingQueue));
}
QueryInvitationRunner这个类实现Runnable,重写run方法,至于跑什么看业务需求
定时任务会根据你的设置的定时间去跑,在这附上在线Cron表达式生成器http://cron.qqe2.com/
三:一些注解的解释
1.@DisallowConcurrentExecution :Quartz的定时任务都是默认并发执行的,不会等待上一次任务执行完毕后才去执行,定时任务太长的话,长时间的占用资源会导致其他任务阻塞
@DisallowConcurrentExecution 不会并发执行,会等待上一个线程执行完才去执行下一个任务
2.@Cacheable :标记在一个方法上表明该方法支持缓存,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法