使用Quartz定时任务,完成开启定时任务,停用定时任务,修改定时任务

导入相应的jar包

<!-- quartz 的jar -->
	    <dependency>
	         <groupId>org.quartz-scheduler</groupId>
	         <artifactId>quartz</artifactId>
	         <version>2.2.1</version>
	    </dependency>
	    <dependency>
	        <groupId>org.quartz-scheduler</groupId>
	        <artifactId>quartz-jobs</artifactId>
	        <version>2.2.1</version>
	    </dependency>
	    <dependency>
             <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>4.1.5.RELEASE</version>
       	 </dependency>

创建QuartzUtils工具类

import com.vrv.platform.domain.TimingSetting;
import com.vrv.platform.orm.zzb.TimingSettingMapper;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class QuartzUtils {

    private static final Logger log = LoggerFactory.getLogger(QuartzUtils.class);
    private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();

    /**
     * 功能: 添加一个定时任务
     *
     * @param jobName          任务名
     * @param jobGroupName     任务组名
     * @param triggerName      触发器名
     * @param triggerGroupName 触发器组名
     * @param jobClass         任务的类类型  eg:TimedMassJob.class
     * @param cron             时间设置 表达式,参考quartz说明文档
     * @param objects          可变参数需要进行传参的值
     */
    public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName, Class jobClass, String cron, Object... objects) {
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();
            // 任务名,任务组,任务执行类
            JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
            // 触发器
            if (objects != null) {
                for (int i = 0; i < objects.length; i++) {
                    //该数据可以通过Job中的JobDataMap dataMap = context.getJobDetail().getJobDataMap();来进行参数传递值
                    jobDetail.getJobDataMap().put("data" + (i + 1), objects[i]);
                }
            }
            TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
            // 触发器名,触发器组
            triggerBuilder.withIdentity(triggerName, triggerGroupName);
            triggerBuilder.startNow();
            // 触发器时间设定
            triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
            // 创建Trigger对象
            CronTrigger trigger = (CronTrigger) triggerBuilder.build();
            // 调度容器设置JobDetail和Trigger
            scheduler.scheduleJob(jobDetail, trigger);
            // 启动
            if (!scheduler.isShutdown()) {
                scheduler.start();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 功能:修改一个任务的触发时间
     *
     * @param jobName
     * @param jobGroupName
     * @param triggerName      触发器名
     * @param triggerGroupName 触发器组名
     * @param cron             时间设置,参考quartz说明文档
     */
    public static void modifyJobTime(String jobName, String jobGroupName, String triggerName, String triggerGroupName, String cron) {
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if (trigger == null) {
                return;
            }
            String oldTime = trigger.getCronExpression();
            if (!oldTime.equalsIgnoreCase(cron)) {
                // 触发器
                TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
                // 触发器名,触发器组
                triggerBuilder.withIdentity(triggerName, triggerGroupName);
                triggerBuilder.startNow();
                // 触发器时间设定
                triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
                // 创建Trigger对象
                trigger = (CronTrigger) triggerBuilder.build();
                // 方式一 :修改一个任务的触发时间
                scheduler.rescheduleJob(triggerKey, trigger);
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 功能: 移除一个任务
     *
     * @param jobName
     * @param jobGroupName
     * @param triggerName
     * @param triggerGroupName
     */
    public static void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) {
        try {
            Scheduler scheduler = schedulerFactory.getScheduler();

            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
            // 停止触发器
            scheduler.pauseTrigger(triggerKey);
            // 移除触发器
            scheduler.unscheduleJob(triggerKey);
            // 删除任务
            scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Autowired
    private TimingSettingMapper settingMapper;
    private static TimingSettingMapper settingMapperStatic;

    @PostConstruct
    public void init() {
        settingMapperStatic = this.settingMapper;
    }

    @PostConstruct
    public static void post() {
        log.debug("---------容器启动  初始化定时任务----------");
        TimingSetting allSetting = settingMapperStatic.findAll(1);
        TimingSetting addSetting = settingMapperStatic.findAll(2);
        if (allSetting.getWay() == 0){
            log.debug("---------停用全量备份定时任务----------");
            QuartzUtils.removeJob("all", "allList", "all", "alls");
            return;
        }
        if (addSetting.getWay() == 0){
            log.debug("---------停用增量备份定时任务----------");
            QuartzUtils.removeJob("add", "addList", "add", "adds");
            return;
        }

        if (allSetting != null && allSetting.getWay() != 0  ) {
            log.debug("---------创建全量备份定时任务----------");
            QuartzUtils.removeJob("all", "allList", "all", "alls");
            if (allSetting.getBackuoTime()!=null && !"".equals(allSetting.getBackuoTime())){
                QuartzUtils.addJob("all", "allList", "all", "alls", FullTimingQuartzJob.class, allSetting.getBackuoTime());
            }
        }
        if (addSetting != null && addSetting.getWay() != 0) {
            log.debug("---------创建增量备份定时任务----------");
            QuartzUtils.removeJob("add", "addList", "add", "adds");
            if (addSetting.getBackuoTime()!=null && !"".equals(addSetting.getBackuoTime())){
                QuartzUtils.addJob("add", "addList", "add", "adds", IncrementalTimingQuartzJob.class, addSetting.getBackuoTime());
            }
        }
    }
}

创建执行定时任务的类,实现org.quartz.Job接口

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vrv.platform.service.IDataBackupService;
import com.vrv.platform.util.SpringUtil;

import javax.annotation.PostConstruct;

/**
 * @version V1.0
 * @Description: 全量备份定时
 * @date 2019/6/2512:57
 */
@Component
public class FullTimingQuartzJob implements org.quartz.Job {

    private static final Logger  log = LoggerFactory.getLogger(FullTimingQuartzJob.class);

    private IDataBackupService dataBackupService;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        log.debug("---------全量备份定时任务开始----------");
            dataBackupService = SpringUtil.getBean(IDataBackupService.class);
            dataBackupService.allBackup();
    }
}

这边定义了两个定时任务

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vrv.platform.service.IDataBackupService;
import com.vrv.platform.util.SpringUtil;

/**
 * @version V1.0
 * @Description: 增量备份定时
 * @date 2019/6/2512:57
 */
@Component
public class IncrementalTimingQuartzJob implements org.quartz.Job {

    private static final Logger log = LoggerFactory.getLogger(IncrementalTimingQuartzJob.class);

    private IDataBackupService dataBackupService;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        log.debug("---------增量备份定时任务开始----------");
            dataBackupService = SpringUtil.getBean(IDataBackupService.class);
            dataBackupService.incrementalCackup();
    }
}
在需要改变定时任务的方法中调用工具类,传入相应的参数即可改变定时任务;

案例来源:https://www.cnblogs.com/yipiaoganlu/p/9229874.html;写的非常详细,学习到了很多;工具栏中有更多的功能如:停止全部任务,启动全部任务。我这里只取了自己需要的功能。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Spring Quartz实现定时任务时,如果需要修改定时时间而不重启服务,可以考虑以下几种方式: 1. 使用Quartz的动态定时任务更新功能: Quartz提供了动态修改定时任务的功能,可以通过更新Cron表达式来实现修改定时时间。首先,在配置文件中设置定时任务的Cron表达式为一个变量,然后在代码中通过调用Quartz的API读取配置文件的变量,并更新定时任务的Cron表达式。通过这种方式,不需要重启服务即可修改定时时间。 2. 使用数据库表保存定时任务配置参数: 可以将定时任务配置参数,如定时时间、执行类等保存在数据库表中。然后在代码中通过查询数据库表的方式动态获取定时任务配置参数。当需要修改定时时间时,只需更新数据库表中的相应字段,代码会动态读取到新的定时时间并生效,而不需要重启服务。 3. 使用Spring的动态Bean注册功能: 在项目启动时,通过编程的方式动态注册定时任务的Bean。将定时任务配置属性作为参数传入Bean,当需要修改定时时间时,通过修改Bean的相关属性值来实现。Spring会自动重新加载Bean的定义,并根据新的配置参数重新创建定时任务对象,从而实现修改定时时间而不重启服务。 综上所述,使用Quartz的动态定时任务更新功能、数据库表保存定时任务配置参数或者Spring的动态Bean注册功能,都可以实现在不重启服务的情况下修改定时时间。根据实际项目需求和技术架构选择合适的方式即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值