1. 程式人生 > 其它 >oracle trigger 延遲執行_spring+springMVC+mybatis整合Quartz框架(Oracle版本)

oracle trigger 延遲執行_spring+springMVC+mybatis整合Quartz框架(Oracle版本)

技術標籤:oracle trigger 延遲執行

說明

本文基於大佬的非maven版腳手架增加的功能,大佬的腳手架是MySQL版本的,並且不再更新了,我對它進行了資料庫移植,在下篇文章我會寫出Oracle的移植相關細節。大佬的腳手架地址:Arthur/irs,我引入了quartz.jar,關於spring和springmvc+mybatis的配置不詳細說,運用了mybatis的generator生成相關的後臺程式碼,前臺程式碼就不寫了。

介面展示

2831df98a5b87497dd692bd0b424afec.png

資料庫表設計

bd71c99d007f5f2d0018d520fe5d0842.png

JOB_ID設定為主鍵

資料序列

create sequence SEQ_TB_JOBS
minvalue 1
maxvalue 9999999999999999999999999999
start with 25
increment by 1
cache 20;

Quartz工具類

public class QuartzManagerUtil {
	private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();

	/**
	 * @Description 新增一個定時任務
	 * 
	 * @param jobName
	 *            任務名
	 * @param jobGroupName
	 *            任務組名
	 * @param triggerName
	 *            觸發器名
	 * @param triggerGroupName
	 *            觸發器組名
	 * @param jobClass
	 *            任務
	 * @param cron
	 *            事件表示式
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static void addJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName,
			Class jobClass, String cron) {
		try {
			Scheduler scheduler = schedulerFactory.getScheduler();

			// 任務名,任務組,任務執行類
			JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
			// 觸發器
			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 (SchedulerException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @Description: 修改一個任務的觸發時間
	 * 
	 * @param jobName
	 *            任務名
	 * @param jobGroupName
	 *            任務組名
	 * @param triggerName
	 *            觸發器名
	 * @param triggerGroupName
	 *            觸發器組名
	 * @param cron
	 *            時間表達式
	 */
	public static void modifyJobCron(String jobName, String jobGroupName, String triggerName, String triggerGroupName,
			String cron) {
		try {
			Scheduler scheduler = schedulerFactory.getScheduler();
			TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
			CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
			if (cronTrigger == null) {
				return;
			}
			String oldTime = cronTrigger.getCronExpression();
			if (!oldTime.equalsIgnoreCase(cron)) {
				/** 方式一:呼叫 rescheduleJob開始 */
				// 觸發器
				TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
				// 觸發器名,觸發器組
				triggerBuilder.withIdentity(triggerName, triggerGroupName);
				triggerBuilder.startNow();
				// 觸發器時間設定
				triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
				// 建立Trigger物件
				cronTrigger = (CronTrigger) triggerBuilder.build();
				// 修改一個任務的觸發器時間
				scheduler.rescheduleJob(triggerKey, cronTrigger);

				/** 方法二:先刪除,然後建立一個新的job */
				/*
				 * JobDetail jobDetail =
				 * scheduler.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
				 * Class<? extends Job> jobClass = jobDetail.getJobClass();
				 * removeJob(jobName, jobGroupName, triggerName,
				 * triggerGroupName); addJob(jobName, jobGroupName, triggerName,
				 * triggerGroupName, jobClass, cron);
				 */

			}

		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @Description 刪除一個任務
	 * 
	 * @param jobName
	 *            任務名
	 * @param jobGroupName
	 *            任務組名
	 * @param triggerName
	 *            觸發器名
	 * @param triggerGroupName
	 *            觸發器組名
	 */
	public static void deleteJob(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 (SchedulerException e) {
			e.printStackTrace();
		}

	}

	/**
	 * @Description 停用所有任務
	 *
	 */
	public static void pauseAllJob() {
		try {
			Scheduler scheduler = schedulerFactory.getScheduler();
			scheduler.pauseAll();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}

	}

	/**
	 * @Description 啟用所有任務
	 */
	public static void resumeAll(){
		try {
			Scheduler scheduler = schedulerFactory.getScheduler();
			scheduler.resumeAll();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
		
	}

	/**
	 * @Description 停用某個任務
	 * 
	 * @param jobName
	 *            任務名
	 * @param jobGroupName
	 *            任務組名
	 */
	public static void pauseJob(String jobName, String jobGroupName) {
		try {
			Scheduler scheduler = schedulerFactory.getScheduler();
			scheduler.pauseJob(JobKey.jobKey(jobName, jobGroupName));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}

	}

	/**
	 * @Description 啟用某個任務
	 * @param jobName
	 *            任務名
	 * @param jobGroupName
	 *            任務組名
	 */
	public static void resumeJob(String jobName, String jobGroupName) {
		try {
			Scheduler scheduler = schedulerFactory.getScheduler();
			scheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}

	}
	
	/**
	 * 關閉所有任務
	 */
	public static void shutDownAll(){
		try {
			Scheduler scheduler = schedulerFactory.getScheduler();
			if(!scheduler.isShutdown()){
				scheduler.shutdown();
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 啟動所有任務
	 */
	public static void startAll(){
		try {
			Scheduler scheduler = schedulerFactory.getScheduler();
			scheduler.start();
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 立即執行一次任務
	 */
	public static void runOnce(String jobName, String jobGroupName){
		try {
			Scheduler scheduler = schedulerFactory.getScheduler();
			scheduler.triggerJob(JobKey.jobKey(jobName, jobGroupName));
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 查詢某個任務的狀態
	 */
	public static TriggerState getJobStatus(String triggerName, String triggerGroupName) throws SchedulerException{
    	Scheduler scheduler = schedulerFactory.getScheduler();  
    	TriggerState state = scheduler.getTriggerState(TriggerKey.triggerKey(triggerName, triggerGroupName));
    	return state;
    }

}

JobController程式碼

@Controller
@RequestMapping("job")
public class JobController {

	@Autowired
	private JobService jobService;

	@RequestMapping("/jobList")
	@RequiresPermissions("job:job:list")
	public String jobList() {
		return "page/job/jobList";
	}

	@RequestMapping("/getJobList")
	@RequiresPermissions("job:job:list")
	@ResponseBody
	public ResultUtil getJobList(Integer page, Integer limit) {
		return jobService.selectJobs(page, limit);

	}

	@RequestMapping("/getExecutingJobList")
	@RequiresPermissions("job:job:list")
	@ResponseBody
	public ResultUtil getExecutingJobList(Integer page, Integer limit) {
		return jobService.getExecutingJobList(page, limit);

	}

	@SysLog("批量刪除指定任務資訊")
	@RequestMapping("/delJobs/{jobsId}")
	@RequiresPermissions("job:job:delete")
	@ResponseBody
	public ResultUtil delJobs(@PathVariable("jobsId") String jobsId) {
		ResultUtil resultUtil = new ResultUtil();

		try {
			jobService.delJobs(jobsId);
			resultUtil.setCode(0);
		} catch (Exception e) {
			resultUtil.setCode(500);
			e.printStackTrace();
		}
		return resultUtil;

	}

	@RequestMapping("/addJob")
	@RequiresPermissions("job:job:save")
	public String addJob(Model model) {
		return "page/job/addJob";
	}

	@SysLog("新增任務資訊")
	@RequiresPermissions("job:job:save")
	@RequestMapping("/toSaveJob")
	@ResponseBody
	public ResultUtil toSaveJob(TbJobs job) {
		List<TbJobs> jobList = jobService.selectByColumn(job);
		if (jobList.size() > 0) {
			return ResultUtil.ok("新增的任務失敗,存在重複欄位值");
		}
		if (!CronExpression.isValidExpression(job.getCron())) {
			return ResultUtil.ok("新增任務失敗,時間表達式格式不正確");
		}
		
		try {
			QuartzManagerUtil.addJob(job.getJobName(), job.getJobGroupName(), job.getTriggerName(),
					job.getJobGroupName(), Class.forName(job.getClassName()), job.getCron());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return ResultUtil.error("新增失敗,執行類不存在");
		}
		job.setStatus("0");
		jobService.insertJob(job);
		return ResultUtil.ok("新增任務成功");
	}

	@RequestMapping("/editJob/{jobId}")
	@RequiresPermissions("job:job:update")
	public String editJob(Model model, @PathVariable("jobId") String jobId) {
		TbJobs job = jobService.selectByPrimaryKey(Long.parseLong(jobId));
		model.addAttribute("job", job);
		return "page/job/editJob";
	}

	@SysLog("修改任務資訊")
	@RequiresPermissions("job:job:update")
	@RequestMapping("/toEditJob")
	@ResponseBody
	public ResultUtil toEditJob(TbJobs job) {
		job.setStatus("0");
		jobService.updateByPrimaryKey(job);
		QuartzManagerUtil.modifyJobCron(job.getJobName(), job.getJobGroupName(), job.getTriggerName(),
				job.getTriggerGroupName(), job.getCron());
		QuartzManagerUtil.resumeJob(job.getJobName(), job.getJobGroupName());
		return ResultUtil.ok("修改任務成功");
	}

	@SysLog("啟用任務")
	@RequestMapping("/resumeJob/{jobId}")
	@ResponseBody
	public ResultUtil resumeJob(@PathVariable("jobId") String jobId) {
		TbJobs job = jobService.selectByPrimaryKey(Long.parseLong(jobId));
		StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
		try {
			Scheduler scheduler = schedulerFactory.getScheduler();
			TriggerState state = scheduler
					.getTriggerState(TriggerKey.triggerKey(job.getTriggerName(), job.getTriggerGroupName()));
			if (state.equals(TriggerState.NONE)) {
				QuartzManagerUtil.addJob(job.getJobName(), job.getJobGroupName(), job.getTriggerName(),
						job.getJobGroupName(), Class.forName(job.getClassName()), job.getCron());
			} else {
				QuartzManagerUtil.resumeJob(job.getJobName(), job.getJobGroupName());
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return ResultUtil.error("新增失敗,執行類不存在");
		}

		job.setStatus("0");
		jobService.updateByPrimaryKey(job);
		return ResultUtil.ok();
	}

	@SysLog("停用任務")
	@RequestMapping("/pauseJob/{jobId}")
	@ResponseBody
	public ResultUtil pauseJob(@PathVariable("jobId") String jobId) {
		TbJobs job = jobService.selectByPrimaryKey(Long.parseLong(jobId));
		QuartzManagerUtil.pauseJob(job.getJobName(), job.getJobGroupName());
		job.setStatus("1");
		jobService.updateByPrimaryKey(job);
		return ResultUtil.ok();
	}

	@SysLog("立即執行一次任務")
	@RequestMapping("/runOnce/{jobId}")
	@ResponseBody
	public ResultUtil runOnce(@PathVariable("jobId") String jobId) {
		TbJobs job = jobService.selectByPrimaryKey(Long.parseLong(jobId));
		QuartzManagerUtil.runOnce(job.getJobName(), job.getJobGroupName());
		return ResultUtil.ok();
	}

}

JobService程式碼

public interface JobService {
	
	//獲取所有任務
	public ResultUtil selectJobs(Integer page,Integer limit);
	
	//獲取所有執行中的任務
	public ResultUtil getExecutingJobList(Integer page,Integer limit);
	
	//批量刪除指定任務
	public void delJobs(String jobsId);
	
	//插入任務
	public void insertJob(TbJobs job);
	
	//根據任務Id查詢任務
	public TbJobs selectByPrimaryKey(Long jobId);
	
	//根據任務ID更新任務資訊
	public void updateByPrimaryKey(TbJobs job);
	
	//根據欄位查詢插入的任務是否有重複欄位值
	public List<TbJobs> selectByColumn(TbJobs job);
	
	//根據欄位查詢插入的任務是否有重複欄位值2
	public TbJobs selectByColumn2(TbJobs job);
	
	//查詢資料庫中所有的任務資訊
	public List<TbJobs> selectAllJobs();
	
	public List<TbJobs> selectByExample(TbJobsExample example);
}

JobServiceImpl程式碼

@Service
public class JobServiceImpl implements JobService {

	@Autowired
	private TbJobsMapper jobMapper;

	@Override
	public ResultUtil selectJobs(Integer page, Integer limit) {
		PageHelper.startPage(page, limit);
		TbJobsExample example = new TbJobsExample();
		List<TbJobs> list = jobMapper.selectByExample(example);
		PageInfo<TbJobs> pageInfo = new PageInfo<TbJobs>(list);
		ResultUtil resultUtil = new ResultUtil();
		resultUtil.setCode(0);
		resultUtil.setCount(pageInfo.getTotal());
		resultUtil.setData(pageInfo.getList());
		return resultUtil;
	}

	@Override
	public ResultUtil getExecutingJobList(Integer page, Integer limit) {
		PageHelper.startPage(page, limit);
		List<TbJobs> jobList = selectAllJobs();
		List<TbJobs> list = new ArrayList<>();
		StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();
		Scheduler scheduler = null;
		try {
			scheduler = schedulerFactory.getScheduler();
			for (TbJobs job : jobList) {
				if (job.getStatus().equals("0")) {
					TriggerState state = scheduler
							.getTriggerState(TriggerKey.triggerKey(job.getTriggerName(), job.getTriggerGroupName()));
					if (state.equals(TriggerState.NORMAL)) {
						list.add(job);
					}
				}
			}
		} catch (SchedulerException e) {
			e.printStackTrace();
		}

		PageInfo<TbJobs> pageInfo = new PageInfo<TbJobs>(list);
		ResultUtil resultUtil = new ResultUtil();
		resultUtil.setCode(0);
		resultUtil.setCount(pageInfo.getTotal());
		resultUtil.setData(pageInfo.getList());
		return resultUtil;
	}

	@Override
	public void delJobs(String jobsId) {
		String[] jobIds = jobsId.split(",");
		for (String jobId : jobIds) {
			TbJobs job = selectByPrimaryKey(Long.parseLong(jobId));
			QuartzManagerUtil.deleteJob(job.getJobName(), job.getJobGroupName(), job.getTriggerName(),
					job.getTriggerGroupName());
			jobMapper.deleteByPrimaryKey(Long.parseLong(jobId));
		}
	}

	@Override
	public void insertJob(TbJobs job) {
		jobMapper.insert(job);
	}

	@Override
	public TbJobs selectByPrimaryKey(Long jobId) {
		return jobMapper.selectByPrimaryKey(jobId);
	}

	@Override
	public void updateByPrimaryKey(TbJobs job) {
		jobMapper.updateByPrimaryKey(job);

	}

	@Override
	public List<TbJobs> selectByColumn(TbJobs job) {
		return jobMapper.selectByColumn(job);
	}

	@Override
	public TbJobs selectByColumn2(TbJobs job) {
		return jobMapper.selectByColumn2(job);
	}

	@Override
	public List<TbJobs> selectAllJobs() {
		return jobMapper.selectAllJobs();
	}

	public List<TbJobs> selectByExample(TbJobsExample example) {
		return jobMapper.selectByExample(example);
	}

}

JobMapper程式碼

public interface TbJobsMapper {
    int countByExample(TbJobsExample example);

    int deleteByExample(TbJobsExample example);

    int deleteByPrimaryKey(Long jobId);

    int insert(TbJobs record);

    int insertSelective(TbJobs record);

    List<TbJobs> selectByExample(TbJobsExample example);

    TbJobs selectByPrimaryKey(Long jobId);
    
    List<TbJobs> selectByColumn(TbJobs job);
    
    TbJobs selectByColumn2(TbJobs job);
    
    List<TbJobs> selectAllJobs();

    int updateByExampleSelective(@Param("record") TbJobs record, @Param("example") TbJobsExample example);

    int updateByExample(@Param("record") TbJobs record, @Param("example") TbJobsExample example);

    int updateByPrimaryKeySelective(TbJobs record);

    int updateByPrimaryKey(TbJobs record);
}

JobMapper.xml程式碼

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.irs.mapper.TbJobsMapper" >
  <resultMap id="BaseResultMap" type="com.irs.pojo.TbJobs" >
    <id column="JOB_ID" property="jobId" jdbcType="BIGINT" />
    <result column="JOB_NAME" property="jobName" jdbcType="VARCHAR" />
    <result column="JOB_GROUP_NAME" property="jobGroupName" jdbcType="VARCHAR" />
    <result column="TRIGGER_NAME" property="triggerName" jdbcType="VARCHAR" />
    <result column="TRIGGER_GROUP_NAME" property="triggerGroupName" jdbcType="VARCHAR" />
    <result column="CRON" property="cron" jdbcType="VARCHAR" />
    <result column="CLASS_NAME" property="className" jdbcType="VARCHAR" />
    <result column="STATUS" property="status" jdbcType="VARCHAR" />
  </resultMap>
  <sql id="Example_Where_Clause" >
    <where >
      <foreach collection="oredCriteria" item="criteria" separator="or" >
        <if test="criteria.valid" >
          <trim prefix="(" suffix=")" prefixOverrides="and" >
            <foreach collection="criteria.criteria" item="criterion" >
              <choose >
                <when test="criterion.noValue" >
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue" >
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue" >
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue" >
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Update_By_Example_Where_Clause" >
    <where >
      <foreach collection="example.oredCriteria" item="criteria" separator="or" >
        <if test="criteria.valid" >
          <trim prefix="(" suffix=")" prefixOverrides="and" >
            <foreach collection="criteria.criteria" item="criterion" >
              <choose >
                <when test="criterion.noValue" >
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue" >
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue" >
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue" >
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator="," >
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Base_Column_List" >
    JOB_ID, JOB_NAME, JOB_GROUP_NAME, TRIGGER_NAME, TRIGGER_GROUP_NAME, CRON, CLASS_NAME, 
    STATUS
  </sql>
  <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.irs.pojo.TbJobsExample" >
    select
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from tb_jobs
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
  </select>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
    select 
    <include refid="Base_Column_List" />
    from tb_jobs
    where JOB_ID = #{jobId,jdbcType=BIGINT}
  </select>
   <select id="selectAllJobs" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from TB_JOBS
    where 1=1
  </select>
  <select id="selectByColumn" resultMap="BaseResultMap" parameterType="com.irs.pojo.TbJobs" >
    select 
    <include refid="Base_Column_List" />
    from TB_JOBS
    where 1=1
      <if test="jobName!=null">
      and JOB_NAME = #{jobName,jdbcType=VARCHAR}
      </if>
      <if test="jobGroupName!=null">
      and JOB_GROUP_NAME = #{jobGroupName,jdbcType=VARCHAR}
      </if>
      <if test="triggerName!=null">
      and TRIGGER_NAME = #{triggerName,jdbcType=VARCHAR}
      </if>
      <if test="triggerGroupName!=null">
      and TRIGGER_GROUP_NAME = #{triggerGroupName,jdbcType=VARCHAR}
      </if>
      <if test="className!=null">
      and CLASS_NAME = #{className,jdbcType=VARCHAR}
      </if>
  </select>
  <select id="selectByColumn2" resultMap="BaseResultMap" parameterType="com.irs.pojo.TbJobs" >
    select 
    <include refid="Base_Column_List" />
    from TB_JOBS
    where 1=1
      <if test="jobName!=null">
      and JOB_NAME = #{jobName,jdbcType=VARCHAR}
      </if>
      <if test="jobGroupName!=null">
      and JOB_GROUP_NAME = #{jobGroupName,jdbcType=VARCHAR}
      </if>
      <if test="triggerName!=null">
      and TRIGGER_NAME = #{triggerName,jdbcType=VARCHAR}
      </if>
      <if test="triggerGroupName!=null">
      and TRIGGER_GROUP_NAME = #{triggerGroupName,jdbcType=VARCHAR}
      </if>
      <if test="className!=null">
      and CLASS_NAME = #{className,jdbcType=VARCHAR}
      </if>
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >
    delete from tb_jobs
    where JOB_ID = #{jobId,jdbcType=BIGINT}
  </delete>
  <delete id="deleteByExample" parameterType="com.irs.pojo.TbJobsExample" >
    delete from tb_jobs
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
  </delete>
  <insert id="insert" parameterType="com.irs.pojo.TbJobs" >
    insert into tb_jobs (JOB_ID, JOB_NAME, JOB_GROUP_NAME, 
      TRIGGER_NAME, TRIGGER_GROUP_NAME, CRON, 
      CLASS_NAME, STATUS)
    values (#{jobId,jdbcType=BIGINT}, #{jobName,jdbcType=VARCHAR}, #{jobGroupName,jdbcType=VARCHAR}, 
      #{triggerName,jdbcType=VARCHAR}, #{triggerGroupName,jdbcType=VARCHAR}, #{cron,jdbcType=VARCHAR}, 
      #{className,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR})
  </insert>
  <insert id="insertSelective" parameterType="com.irs.pojo.TbJobs" >
    insert into tb_jobs
    <trim prefix="(" suffix=")" suffixOverrides="," >
      <if test="jobId != null" >
        JOB_ID,
      </if>
      <if test="jobName != null" >
        JOB_NAME,
      </if>
      <if test="jobGroupName != null" >
        JOB_GROUP_NAME,
      </if>
      <if test="triggerName != null" >
        TRIGGER_NAME,
      </if>
      <if test="triggerGroupName != null" >
        TRIGGER_GROUP_NAME,
      </if>
      <if test="cron != null" >
        CRON,
      </if>
      <if test="className != null" >
        CLASS_NAME,
      </if>
      <if test="status != null" >
        STATUS,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides="," >
      <if test="jobId != null" >
        #{jobId,jdbcType=BIGINT},
      </if>
      <if test="jobName != null" >
        #{jobName,jdbcType=VARCHAR},
      </if>
      <if test="jobGroupName != null" >
        #{jobGroupName,jdbcType=VARCHAR},
      </if>
      <if test="triggerName != null" >
        #{triggerName,jdbcType=VARCHAR},
      </if>
      <if test="triggerGroupName != null" >
        #{triggerGroupName,jdbcType=VARCHAR},
      </if>
      <if test="cron != null" >
        #{cron,jdbcType=VARCHAR},
      </if>
      <if test="className != null" >
        #{className,jdbcType=VARCHAR},
      </if>
      <if test="status != null" >
        #{status,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <select id="countByExample" parameterType="com.irs.pojo.TbJobsExample" resultType="java.lang.Integer" >
    select count(*) from tb_jobs
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
  </select>
  <update id="updateByExampleSelective" parameterType="map" >
    update tb_jobs
    <set >
      <if test="record.jobId != null" >
        JOB_ID = #{record.jobId,jdbcType=BIGINT},
      </if>
      <if test="record.jobName != null" >
        JOB_NAME = #{record.jobName,jdbcType=VARCHAR},
      </if>
      <if test="record.jobGroupName != null" >
        JOB_GROUP_NAME = #{record.jobGroupName,jdbcType=VARCHAR},
      </if>
      <if test="record.triggerName != null" >
        TRIGGER_NAME = #{record.triggerName,jdbcType=VARCHAR},
      </if>
      <if test="record.triggerGroupName != null" >
        TRIGGER_GROUP_NAME = #{record.triggerGroupName,jdbcType=VARCHAR},
      </if>
      <if test="record.cron != null" >
        CRON = #{record.cron,jdbcType=VARCHAR},
      </if>
      <if test="record.className != null" >
        CLASS_NAME = #{record.className,jdbcType=VARCHAR},
      </if>
      <if test="record.status != null" >
        STATUS = #{record.status,jdbcType=VARCHAR},
      </if>
    </set>
    <if test="_parameter != null" >
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByExample" parameterType="map" >
    update tb_jobs
    set JOB_ID = #{record.jobId,jdbcType=BIGINT},
      JOB_NAME = #{record.jobName,jdbcType=VARCHAR},
      JOB_GROUP_NAME = #{record.jobGroupName,jdbcType=VARCHAR},
      TRIGGER_NAME = #{record.triggerName,jdbcType=VARCHAR},
      TRIGGER_GROUP_NAME = #{record.triggerGroupName,jdbcType=VARCHAR},
      CRON = #{record.cron,jdbcType=VARCHAR},
      CLASS_NAME = #{record.className,jdbcType=VARCHAR},
      STATUS = #{record.status,jdbcType=VARCHAR}
    <if test="_parameter != null" >
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByPrimaryKeySelective" parameterType="com.irs.pojo.TbJobs" >
    update tb_jobs
    <set >
      <if test="jobName != null" >
        JOB_NAME = #{jobName,jdbcType=VARCHAR},
      </if>
      <if test="jobGroupName != null" >
        JOB_GROUP_NAME = #{jobGroupName,jdbcType=VARCHAR},
      </if>
      <if test="triggerName != null" >
        TRIGGER_NAME = #{triggerName,jdbcType=VARCHAR},
      </if>
      <if test="triggerGroupName != null" >
        TRIGGER_GROUP_NAME = #{triggerGroupName,jdbcType=VARCHAR},
      </if>
      <if test="cron != null" >
        CRON = #{cron,jdbcType=VARCHAR},
      </if>
      <if test="className != null" >
        CLASS_NAME = #{className,jdbcType=VARCHAR},
      </if>
      <if test="status != null" >
        STATUS = #{status,jdbcType=VARCHAR},
      </if>
    </set>
    where JOB_ID = #{jobId,jdbcType=BIGINT}
  </update>
  <update id="updateByPrimaryKey" parameterType="com.irs.pojo.TbJobs" >
    update tb_jobs
    set JOB_NAME = #{jobName,jdbcType=VARCHAR},
      JOB_GROUP_NAME = #{jobGroupName,jdbcType=VARCHAR},
      TRIGGER_NAME = #{triggerName,jdbcType=VARCHAR},
      TRIGGER_GROUP_NAME = #{triggerGroupName,jdbcType=VARCHAR},
      CRON = #{cron,jdbcType=VARCHAR},
      CLASS_NAME = #{className,jdbcType=VARCHAR},
      STATUS = #{status,jdbcType=VARCHAR}
    where JOB_ID = #{jobId,jdbcType=BIGINT}
  </update>
</mapper>

Tomcat啟動就載入資料庫中的任務

public class QuartzStartInitialize implements ApplicationListener<ContextRefreshedEvent>{

	
	@Autowired
	private JobService jobService;
	
	 private  static  final Logger logger = LoggerFactory.getLogger(QuartzStartInitialize.class);  
	
	@Override
	public void onApplicationEvent(ContextRefreshedEvent event) {
		if(event.getApplicationContext().getParent()==null){
			List<TbJobs> jobList = jobService.selectAllJobs();
			if (jobList.size() > 0) {
				for (TbJobs job : jobList) {
					if (job.getStatus().equals("0")) {
						if (CronExpression.isValidExpression(job.getCron())) {
							QuartzManagerUtil.deleteJob(job.getJobName(), job.getJobGroupName(), job.getTriggerName(),
									job.getTriggerGroupName());
							try {
								QuartzManagerUtil.addJob(job.getJobName(), job.getJobGroupName(), job.getTriggerName(),
										job.getTriggerGroupName(), Class.forName(job.getClassName()), job.getCron());
								logger.info("定時任務"+job.getJobName()+": 開始啟動");
							} catch (ClassNotFoundException e) {
								e.printStackTrace();
							}
						}else{
							logger.warn("定時任務"+job.getJobName()+": cron表示式不正確");
						}
					}
				}
			}
		}
		
	}

}

Spring配置

將上面的QuartzStartInitialize 類配置到applicationContext-dao.xml中。

<bean class="com.irs.annotation.QuartzStartInitialize" />