springboot集成动态任务调度,springboot集成动态quartz调度

14 篇文章 0 订阅
1 篇文章 0 订阅

一、静态任务和动态任务区别

大家经常使用注解:@Scheduled(cron=“0/5 * * * * ?”)
每5秒钟执行一次,很多场景下是需要动态的新增调度任务,比如提交订单后30分钟内未支付则自动取消订单。动态任务就是为了实现这样的场景。

二、首先添加pom和创建配置类

添加pom

<dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>

创建配置类

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ScheduConfigure {

    /**
     * 初始注入scheduler
     * @return
     * @throws SchedulerException
     */
    @Bean
    public Scheduler scheduler() throws SchedulerException {
        SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
        return schedulerFactoryBean.getScheduler();
    }
}

三、然后实现Job接口,实现其方法

import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class MyScheduler implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("任务开始执行");
        //获取job对象
        JobDetail jobDetail = jobExecutionContext.getJobDetail();
        //创建任务时候 传入的参数对象
        Object orderNo = jobDetail.getJobDataMap().get("orderNo");
        //job对象内无法注入 service对象,可以在创建任务时候把对象传进来,调用service
        OrderService service = (OrderService)jobDetail.getJobDataMap().get("service");
        //执行订单的任务逻辑
        service.cancelOrder(orderNo);
        System.out.println("任务结束执行");
    }
}

四、创建jobDetail、trigger、启动任务

@Service
public class JobService {

    @Autowired
    private OrderService service;
    @Resource
    private Scheduler scheduler;

    public void startJob(){
        //创建job  指定job类型为MyScheduler.class。  name和group两个参数一起来判定是否是一个job
        JobDetail jobDetail = JobBuilder.newJob(MyScheduler.class).withIdentity("name", "group").build();
        jobDetail.getJobDataMap().put("orderNo","123");//传入参数
        jobDetail.getJobDataMap().put("service","service"); //job实现类内无法 使用 注入,所以可以传入service对象
        Date date = DateUtils.str2Date("2022-03-25 17:18:50", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        //创建SimpleTrigger
        SimpleTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("name", "group")
                .startAt(date)//设置一个执行任务时间
                .withSchedule(SimpleScheduleBuilder.simpleSchedule())
//                        .withIntervalInMilliseconds(0)//指定一个重复间隔,以毫秒为单位,这里注释掉,代表执行一次就不再执行了
//                        .withRepeatCount(0))//指定重复的次数
                .build();
        //另一种trigger实现
//        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 0/5 * * * ?");
//        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("job2", "group2")
//                .withSchedule(cronScheduleBuilder).build();
        try {
            scheduler.scheduleJob(jobDetail,trigger);
            //判断是否启动
            boolean started = scheduler.isStarted();
            if(!started){
                scheduler.start();
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

五、job的一些其他方法

    /**
     * 获取Job信息
     * 
     * @param name
     * @param group
     * @return
     * @throws SchedulerException
     */
    public String getJobInfo(String name, String group) throws SchedulerException {
        TriggerKey triggerKey = new TriggerKey(name, group);
        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        return String.format("time:%s,state:%s", cronTrigger.getCronExpression(),
                scheduler.getTriggerState(triggerKey).name());
    }

    /**
     * 修改某个任务的执行时间
     * 
     * @param name
     * @param group
     * @param time
     * @return
     * @throws SchedulerException
     */
    public boolean modifyJob(String name, String group, String time) throws SchedulerException {
        Date date = null;
        TriggerKey triggerKey = new TriggerKey(name, group);
        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        String oldTime = cronTrigger.getCronExpression();
        if (!oldTime.equalsIgnoreCase(time)) {
            CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(time);
            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(name, group)
                    .withSchedule(cronScheduleBuilder).build();
            date = scheduler.rescheduleJob(triggerKey, trigger);
        }
        return date != null;
    }

    /**
     * 暂停所有任务
     * 
     * @throws SchedulerException
     */
    public void pauseAllJob() throws SchedulerException {
        scheduler.pauseAll();
    }

    /**
     * 暂停某个任务
     * 
     * @param name
     * @param group
     * @throws SchedulerException
     */
    public void pauseJob(String name, String group) throws SchedulerException {
        JobKey jobKey = new JobKey(name, group);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null)
            return;
        scheduler.pauseJob(jobKey);
    }

    /**
     * 恢复所有任务
     * 
     * @throws SchedulerException
     */
    public void resumeAllJob() throws SchedulerException {
        scheduler.resumeAll();
    }

    /**
     * 恢复某个任务
     * 
     * @param name
     * @param group
     * @throws SchedulerException
     */
    public void resumeJob(String name, String group) throws SchedulerException {
        JobKey jobKey = new JobKey(name, group);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null)
            return;
        scheduler.resumeJob(jobKey);
    }

    /**
     * 删除某个任务
     * 
     * @param name
     * @param group
     * @throws SchedulerException
     */
    public void deleteJob(String name, String group) throws SchedulerException {
        JobKey jobKey = new JobKey(name, group);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if (jobDetail == null)
            return;
        scheduler.deleteJob(jobKey);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangyue23com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值