若依框架集成的Scheduler真不错
简单的后台配置即可实现非常复杂的需求 任务最短可以 一秒执行一次
定义了一个消费3秒的业务
@Component("KlTask")
public class KlTask {
int i = 0;
public void KlTest() {
i++;
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":i:" + i);
}
}
如果运行并行则输出
RuoyiScheduler_Worker-1:i:11
RuoyiScheduler_Worker-2:i:11
RuoyiScheduler_Worker-3:i:11
RuoyiScheduler_Worker-4:i:11
RuoyiScheduler_Worker-5:i:11
RuoyiScheduler_Worker-6:i:11
RuoyiScheduler_Worker-7:i:11
RuoyiScheduler_Worker-8:i:11
RuoyiScheduler_Worker-9:i:12
RuoyiScheduler_Worker-10:i:13
RuoyiScheduler_Worker-11:i:14
RuoyiScheduler_Worker-12:i:14
RuoyiScheduler_Worker-13:i:15
RuoyiScheduler_Worker-14:i:17
RuoyiScheduler_Worker-15:i:17
RuoyiScheduler_Worker-16:i:19
RuoyiScheduler_Worker-17:i:19
RuoyiScheduler_Worker-18:i:21
RuoyiScheduler_Worker-19:i:21
RuoyiScheduler_Worker-20:i:23
如果不允许并行则输出
RuoyiScheduler_Worker-1:i:184
RuoyiScheduler_Worker-2:i:186
RuoyiScheduler_Worker-4:i:186
RuoyiScheduler_Worker-5:i:188
RuoyiScheduler_Worker-6:i:188
RuoyiScheduler_Worker-7:i:190
RuoyiScheduler_Worker-8:i:191
RuoyiScheduler_Worker-9:i:192
结论 如果需要线程安全的 可以 禁止并行 不需要线程安全的 可以允许并行 类只会实例化一次 最大的节约了系统开销 非常赞!
代码解析 TODO
Class<? extends Job> jobClass = getQuartzJobClass(job);
// 构建job信息
Long jobId = job.getJobId();
String jobGroup = job.getJobGroup();
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build();
// 表达式调度构建器
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder);
// 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup))
.withSchedule(cronScheduleBuilder).build();
// 放入参数,运行时的方法可以获取
jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job);
// 判断是否存在
if (scheduler.checkExists(getJobKey(jobId, jobGroup)))
{
// 防止创建时存在数据问题 先移除,然后在执行创建操作
scheduler.deleteJob(getJobKey(jobId, jobGroup));
}
scheduler.scheduleJob(jobDetail, trigger);
// 暂停任务
if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue()))
{
scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));
}