若依 StdScheduler 实现任务队列 定时任务 并发任务 解析

 

 

 

 

若依框架集成的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));
        }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值