Quartz定时器的动态配置

代码解释:Quartz定时器的动态配置。

1、需要的库环境,maven配置如下

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

2、web.xml引入quartz.properties

<!--定时器 -->
    <context-param>
       <param-name>quartz:config-file</param-name>
       <param-value>quartz.properties</param-value>
   </context-param>
   <context-param>
       <param-name>quartz:shutdown-on-unload</param-name>
       <param-value>true</param-value>
   </context-param>
   <context-param>
       <param-name>quartz:wait-on-shutdown</param-name>
       <param-value>false</param-value>
   </context-param>
   <context-param>
       <param-name>quartz:start-scheduler-on-load</param-name>
       <param-value>true</param-value>
   </context-param>
   <listener>
       <listener-class>
           org.quartz.ee.servlet.QuartzInitializerListener
       </listener-class>
   </listener>

3、quartz.properties quartz持久化配置以及其他配置

#固定前缀org.quartz
#主要分为scheduler、threadPool、jobStore、plugin等部分
org.quartz.scheduler.instanceName =DefaultQuartzScheduler
org.quartz.scheduler.rmi.export =false
org.quartz.scheduler.rmi.proxy =false
org.quartz.scheduler.wrapJobExecutionInUserTransaction =false

#实例化ThreadPool时,使用的线程类为SimpleThreadPool
org.quartz.threadPool.class =org.quartz.simpl.SimpleThreadPool

#threadCount和threadPriority将以setter的形式注入ThreadPool实例
#并发个数
org.quartz.threadPool.threadCount =5
#优先级
org.quartz.threadPool.threadPriority =5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread =true

org.quartz.jobStore.misfireThreshold =5000

#默认存储在内存中
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

#持久化
org.quartz.jobStore.class =org.quartz.impl.jdbcjobstore.JobStoreTX

org.quartz.jobStore.tablePrefix =QRTZ_

org.quartz.jobStore.dataSource =qzDS

org.quartz.dataSource.qzDS.driver =oracle.jdbc.driver.OracleDriver

org.quartz.dataSource.qzDS.URL =jdbc:oracle:thin:@***.***.**.***:1521:orcl


org.quartz.dataSource.qzDS.user =admin

org.quartz.dataSource.qzDS.password =111111

org.quartz.dataSource.qzDS.maxConnections =10

4、创建数据库表 QUAR_//用来保存定时任务,以便于后期扫描装填,因为本人是Oracle环境,所以贴出Oracle代码,如果是其他数据库环境,可以去 Quartz官网下载完整文档,然后在压缩包下的z\quartz-2.2.2\docs\dbTables找到自己的环境表,运行脚本就ok了。

delete from qrtz_fired_triggers;
delete from qrtz_simple_triggers;
delete from qrtz_simprop_triggers;
delete from qrtz_cron_triggers;
delete from qrtz_blob_triggers;
delete from qrtz_triggers;
delete from qrtz_job_details;
delete from qrtz_calendars;
delete from qrtz_paused_trigger_grps;
delete from qrtz_locks;
delete from qrtz_scheduler_state;

drop table qrtz_calendars;
drop table qrtz_fired_triggers;
drop table qrtz_blob_triggers;
drop table qrtz_cron_triggers;
drop table qrtz_simple_triggers;
drop table qrtz_simprop_triggers;
drop table qrtz_triggers;
drop table qrtz_job_details;
drop table qrtz_paused_trigger_grps;
drop table qrtz_locks;
drop table qrtz_scheduler_state;


CREATE TABLE qrtz_job_details
(
  SCHED_NAME VARCHAR2(120) NOT NULL,
  JOB_NAME  VARCHAR2(200) NOT NULL,
  JOB_GROUP VARCHAR2(200) NOT NULL,
  DESCRIPTION VARCHAR2(250) NULL,
  JOB_CLASS_NAME   VARCHAR2(250) NOT NULL, 
  IS_DURABLE VARCHAR2(1) NOT NULL,
  IS_NONCONCURRENT VARCHAR2(1) NOT NULL,
  IS_UPDATE_DATA VARCHAR2(1) NOT NULL,
  REQUESTS_RECOVERY VARCHAR2(1) NOT NULL,
  JOB_DATA BLOB NULL,
  CONSTRAINT QRTZ_JOB_DETAILS_PK PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
);
CREATE TABLE qrtz_triggers
(
  SCHED_NAME VARCHAR2(120) NOT NULL,
  TRIGGER_NAME VARCHAR2(200) NOT NULL,
  TRIGGER_GROUP VARCHAR2(200) NOT NULL,
  JOB_NAME  VARCHAR2(200) NOT NULL, 
  JOB_GROUP VARCHAR2(200) NOT NULL,
  DESCRIPTION VARCHAR2(250) NULL,
  NEXT_FIRE_TIME NUMBER(13) NULL,
  PREV_FIRE_TIME NUMBER(13) NULL,
  PRIORITY NUMBER(13) NULL,
  TRIGGER_STATE VARCHAR2(16) NOT NULL,
  TRIGGER_TYPE VARCHAR2(8) NOT NULL,
  START_TIME NUMBER(13) NOT NULL,
  END_TIME NUMBER(13) NULL,
  CALENDAR_NAME VARCHAR2(200) NULL,
  MISFIRE_INSTR NUMBER(2) NULL,
  JOB_DATA BLOB NULL,
  CONSTRAINT QRTZ_TRIGGERS_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  CONSTRAINT QRTZ_TRIGGER_TO_JOBS_FK FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP) 
    REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP) 
);
CREATE TABLE qrtz_simple_triggers
(
  SCHED_NAME VARCHAR2(120) NOT NULL,
  TRIGGER_NAME VARCHAR2(200) NOT NULL,
  TRIGGER_GROUP VARCHAR2(200) NOT NULL,
  REPEAT_COUNT NUMBER(7) NOT NULL,
  REPEAT_INTERVAL NUMBER(12) NOT NULL,
  TIMES_TRIGGERED NUMBER(10) NOT NULL,
  CONSTRAINT QRTZ_SIMPLE_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  CONSTRAINT QRTZ_SIMPLE_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
  REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
CREATE TABLE qrtz_cron_triggers
(
  SCHED_NAME VARCHAR2(120) NOT NULL,
  TRIGGER_NAME VARCHAR2(200) NOT NULL,
  TRIGGER_GROUP VARCHAR2(200) NOT NULL,
  CRON_EXPRESSION VARCHAR2(120) NOT NULL,
  TIME_ZONE_ID VARCHAR2(80),
  CONSTRAINT QRTZ_CRON_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  CONSTRAINT QRTZ_CRON_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
    REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
CREATE TABLE qrtz_simprop_triggers
(          
  SCHED_NAME VARCHAR2(120) NOT NULL,
  TRIGGER_NAME VARCHAR2(200) NOT NULL,
  TRIGGER_GROUP VARCHAR2(200) NOT NULL,
  STR_PROP_1 VARCHAR2(512) NULL,
  STR_PROP_2 VARCHAR2(512) NULL,
  STR_PROP_3 VARCHAR2(512) NULL,
  INT_PROP_1 NUMBER(10) NULL,
  INT_PROP_2 NUMBER(10) NULL,
  LONG_PROP_1 NUMBER(13) NULL,
  LONG_PROP_2 NUMBER(13) NULL,
  DEC_PROP_1 NUMERIC(13,4) NULL,
  DEC_PROP_2 NUMERIC(13,4) NULL,
  BOOL_PROP_1 VARCHAR2(1) NULL,
  BOOL_PROP_2 VARCHAR2(1) NULL,
  CONSTRAINT QRTZ_SIMPROP_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  CONSTRAINT QRTZ_SIMPROP_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
    REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
CREATE TABLE qrtz_blob_triggers
(
  SCHED_NAME VARCHAR2(120) NOT NULL,
  TRIGGER_NAME VARCHAR2(200) NOT NULL,
  TRIGGER_GROUP VARCHAR2(200) NOT NULL,
  BLOB_DATA BLOB NULL,
  CONSTRAINT QRTZ_BLOB_TRIG_PK PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
  CONSTRAINT QRTZ_BLOB_TRIG_TO_TRIG_FK FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) 
      REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);
CREATE TABLE qrtz_calendars
(
  SCHED_NAME VARCHAR2(120) NOT NULL,
  CALENDAR_NAME  VARCHAR2(200) NOT NULL, 
  CALENDAR BLOB NOT NULL,
  CONSTRAINT QRTZ_CALENDARS_PK PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
);
CREATE TABLE qrtz_paused_trigger_grps
(
  SCHED_NAME VARCHAR2(120) NOT NULL,
  TRIGGER_GROUP  VARCHAR2(200) NOT NULL, 
  CONSTRAINT QRTZ_PAUSED_TRIG_GRPS_PK PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
);
CREATE TABLE qrtz_fired_triggers 
(
  SCHED_NAME VARCHAR2(120) NOT NULL,
  ENTRY_ID VARCHAR2(95) NOT NULL,
  TRIGGER_NAME VARCHAR2(200) NOT NULL,
  TRIGGER_GROUP VARCHAR2(200) NOT NULL,
  INSTANCE_NAME VARCHAR2(200) NOT NULL,
  FIRED_TIME NUMBER(13) NOT NULL,
  SCHED_TIME NUMBER(13) NOT NULL,
  PRIORITY NUMBER(13) NOT NULL,
  STATE VARCHAR2(16) NOT NULL,
  JOB_NAME VARCHAR2(200) NULL,
  JOB_GROUP VARCHAR2(200) NULL,
  IS_NONCONCURRENT VARCHAR2(1) NULL,
  REQUESTS_RECOVERY VARCHAR2(1) NULL,
  CONSTRAINT QRTZ_FIRED_TRIGGER_PK PRIMARY KEY (SCHED_NAME,ENTRY_ID)
);
CREATE TABLE qrtz_scheduler_state 
(
  SCHED_NAME VARCHAR2(120) NOT NULL,
  INSTANCE_NAME VARCHAR2(200) NOT NULL,
  LAST_CHECKIN_TIME NUMBER(13) NOT NULL,
  CHECKIN_INTERVAL NUMBER(13) NOT NULL,
  CONSTRAINT QRTZ_SCHEDULER_STATE_PK PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
);
CREATE TABLE qrtz_locks
(
  SCHED_NAME VARCHAR2(120) NOT NULL,
  LOCK_NAME  VARCHAR2(40) NOT NULL, 
  CONSTRAINT QRTZ_LOCKS_PK PRIMARY KEY (SCHED_NAME,LOCK_NAME)
);

create index idx_qrtz_j_req_recovery on qrtz_job_details(SCHED_NAME,REQUESTS_RECOVERY);
create index idx_qrtz_j_grp on qrtz_job_details(SCHED_NAME,JOB_GROUP);

create index idx_qrtz_t_j on qrtz_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP);
create index idx_qrtz_t_jg on qrtz_triggers(SCHED_NAME,JOB_GROUP);
create index idx_qrtz_t_c on qrtz_triggers(SCHED_NAME,CALENDAR_NAME);
create index idx_qrtz_t_g on qrtz_triggers(SCHED_NAME,TRIGGER_GROUP);
create index idx_qrtz_t_state on qrtz_triggers(SCHED_NAME,TRIGGER_STATE);
create index idx_qrtz_t_n_state on qrtz_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
create index idx_qrtz_t_n_g_state on qrtz_triggers(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
create index idx_qrtz_t_next_fire_time on qrtz_triggers(SCHED_NAME,NEXT_FIRE_TIME);
create index idx_qrtz_t_nft_st on qrtz_triggers(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
create index idx_qrtz_t_nft_misfire on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
create index idx_qrtz_t_nft_st_misfire on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
create index idx_qrtz_t_nft_st_misfire_grp on qrtz_triggers(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);

create index idx_qrtz_ft_trig_inst_name on qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME);
create index idx_qrtz_ft_inst_job_req_rcvry on qrtz_fired_triggers(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
create index idx_qrtz_ft_j_g on qrtz_fired_triggers(SCHED_NAME,JOB_NAME,JOB_GROUP);
create index idx_qrtz_ft_jg on qrtz_fired_triggers(SCHED_NAME,JOB_GROUP);
create index idx_qrtz_ft_t_g on qrtz_fired_triggers(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
create index idx_qrtz_ft_tg on qrtz_fired_triggers(SCHED_NAME,TRIGGER_GROUP);

5、编写后台QuartzManager类,完成定时任务的增删改查停启恢

public class QuartzManager {
    
    
    /**
     * @param jobClass 任务实现类
     * @param jobName 任务名称
     *  @param jobGroupName 任务组名
     * @param jobTime 时间表达式 (如:0/5 * * * * ? )
     * @throws SchedulerException 
     */
    public  void addJob(Class<? extends Job> jobClass, String jobName,String jobGroupName,String jobTime)  {
    
    
        try {
    
    
        	// 通过SchedulerFactory获取一个调度器实例  
            SchedulerFactory sf = new StdSchedulerFactory();      
            Scheduler scheduler = sf.getScheduler();  
            //创建jobDetail实例,绑定Job实现类  
            //指明job的名称,所在组的名称,以及绑定job类
            JobDetail jobDetail = JobBuilder.newJob(jobClass)
                            .withIdentity(jobName, jobGroupName)//任务名称和组构成任务key
                            .build();
            //定义调度触发规则  
            //使用cornTrigger规则 
            Trigger trigger = TriggerBuilder.newTrigger()
                        .withIdentity(jobName, jobGroupName)//触发器key
                        .startAt(DateBuilder.futureDate(1, IntervalUnit.SECOND))
                        .withSchedule(CronScheduleBuilder.cronSchedule(jobTime))
                        .startNow().build();
            //把作业和触发器注册到任务调度中
            scheduler.scheduleJob(jobDetail, trigger);
            // 启动
            if (!scheduler.isShutdown()) {
    
    
                scheduler.start();
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }
 
    /**
     * 增加一个job
     * @param jobClass  任务实现类
     * @param jobName  任务名称
     * @param jobGroupName 任务组名
     * @param jobTime  时间表达式 (这是每隔多少秒为一次任务)
     */
    public void addJob(Class<? extends Job> jobClass, String jobName,String jobGroupName,int jobTime){
    
    
        addJob(jobClass,jobName,jobGroupName,jobTime,-1);
    }
 
    /**
     * 增加一个job
     * @param jobClass 任务实现类
     * @param jobName  任务名称
     * @param jobGroupName 任务组名
     * @param jobTime  时间表达式 (这是每隔多少秒为一次任务)
     * @param jobTimes  运行的次数 (<0:表示不限次数)
     */
    public void addJob(Class<? extends Job> jobClass, String jobName,String jobGroupName,int jobTime,int jobTimes){
    
    
         try {
    
    
        	// 通过SchedulerFactory获取一个调度器实例  
             SchedulerFactory sf = new StdSchedulerFactory();      
             Scheduler scheduler = sf.getScheduler();  
             JobDetail jobDetail = JobBuilder.newJob(jobClass)
                             .withIdentity(jobName, jobGroupName)//任务名称和组构成任务key
                             .build();
           //使用simpleTrigger规则
             Trigger trigger=null;
             if(jobTimes<0){
    
    
                 trigger=TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName)  
                        .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withIntervalInSeconds(jobTime))  
                        .startNow().build();
             }else{
    
    
                 trigger=TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName)  
                        .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1).withIntervalInSeconds(jobTime).withRepeatCount(jobTimes))  
                        .startNow().build();
             }
            scheduler.scheduleJob(jobDetail, trigger);
            if (!scheduler.isShutdown()) {
    
    
                scheduler.start();
            }
        } catch (SchedulerException e) {
    
    
            e.printStackTrace();
        }
    }
 
    /**
     * @param jobName
     * @param jobGroupName
     * @param jobTime
     *  修改 一个job的 时间表达式
     */
    public void updateJob(String jobName,String jobGroupName,String jobTime){
    
    
        try {
    
    
        	// 通过SchedulerFactory获取一个调度器实例  
            SchedulerFactory sf = new StdSchedulerFactory();      
            Scheduler scheduler = sf.getScheduler();  
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);  
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);  
            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
                    .withSchedule(CronScheduleBuilder.cronSchedule(jobTime))
                    .build();
            //重启触发器
            scheduler.rescheduleJob(triggerKey, trigger);
        } catch (SchedulerException e) {
    
    
            e.printStackTrace();
        }  
    }
 
    /**
     *  删除任务一个job
     * @param jobName 任务名称
     * @param jobGroupName 任务组名
     */
    public  void deleteJob(String jobName,String jobGroupName) {
    
    
        try {
    
    
        	// 通过SchedulerFactory获取一个调度器实例  
            SchedulerFactory sf = new StdSchedulerFactory();      
            Scheduler scheduler = sf.getScheduler();  
            scheduler.deleteJob(new JobKey(jobName, jobGroupName));
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }
 
    /**
     *  暂停一个job
     * @param jobName
     * @param jobGroupName
     */
    public void pauseJob(String jobName,String jobGroupName){
    
    
        try {
    
    
        	// 通过SchedulerFactory获取一个调度器实例  
            SchedulerFactory sf = new StdSchedulerFactory();      
            Scheduler scheduler = sf.getScheduler();  
            JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);  
            scheduler.pauseJob(jobKey);
        } catch (SchedulerException e) {
    
    
            e.printStackTrace();
        } 
    }
 
    /**
     *   恢复一个job
     * @param jobName
     * @param jobGroupName
     */
    public void resumeJob(String jobName,String jobGroupName){
    
    
        try {
    
    
        	// 通过SchedulerFactory获取一个调度器实例  
            SchedulerFactory sf = new StdSchedulerFactory();      
            Scheduler scheduler = sf.getScheduler();  
            JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
            scheduler.resumeJob(jobKey);
        } catch (SchedulerException e) {
    
    
            e.printStackTrace();
        }
    }
 
    /**
     *   立即执行一个job
     * @param jobName
     * @param jobGroupName
     */
    public void runAJobNow(String jobName,String jobGroupName){
    
    
        try {
    
    
        	// 通过SchedulerFactory获取一个调度器实例  
            SchedulerFactory sf = new StdSchedulerFactory();      
            Scheduler scheduler = sf.getScheduler();  
            JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
            scheduler.triggerJob(jobKey);
        } catch (SchedulerException e) {
    
    
            e.printStackTrace();
        }
    }
 
    /**
     *    获取所有计划中的任务列表
     * @return
     */
    public List<Map<String,Object>> queryAllJob(){
    
    
        List<Map<String,Object>> jobList=null;
        try {
    
    
        	// 通过SchedulerFactory获取一个调度器实例  
            SchedulerFactory sf = new StdSchedulerFactory();      
            Scheduler scheduler = sf.getScheduler();  
             GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();  
             Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
             jobList = new ArrayList<Map<String,Object>>();  
             for (JobKey jobKey : jobKeys) {
    
      
                  List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);  
                  for (Trigger trigger : triggers) {
    
      
                      Map<String,Object> map=new HashMap<String,Object>();
                      map.put("jobName",jobKey.getName());
                      map.put("jobGroupName",jobKey.getGroup());
                      map.put("description","触发器:" + trigger.getKey());
                      Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());  
                      map.put("jobStatus",triggerState.name());
                      if (trigger instanceof CronTrigger) {
    
      
                          CronTrigger cronTrigger = (CronTrigger) trigger;  
                          String cronExpression = cronTrigger.getCronExpression();  
                          map.put("jobTime",cronExpression);
                      }  
                      jobList.add(map);  
                  }  
              }  
        } catch (SchedulerException e) {
    
    
            e.printStackTrace();
        }  
        return jobList;  
    }
 
    /**
     *   获取所有正在运行的job
     * @return
     */
    public List<Map<String,Object>> queryRunJon(){
    
    
        List<Map<String,Object>> jobList=null;
        try {
    
    
        	// 通过SchedulerFactory获取一个调度器实例  
            SchedulerFactory sf = new StdSchedulerFactory();      
            Scheduler scheduler = sf.getScheduler();  
            List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();
            jobList = new ArrayList<Map<String,Object>>(executingJobs.size());  
            for (JobExecutionContext executingJob : executingJobs) {
    
      
                Map<String,Object> map=new HashMap<String, Object>();  
                JobDetail jobDetail = executingJob.getJobDetail();  
                JobKey jobKey = jobDetail.getKey();  
                Trigger trigger = executingJob.getTrigger(); 
                map.put("jobName",jobKey.getName());
                map.put("jobGroupName",jobKey.getGroup());
                map.put("description","触发器:" + trigger.getKey());
                Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());  
                map.put("jobStatus",triggerState.name());
                if (trigger instanceof CronTrigger) {
    
      
                    CronTrigger cronTrigger = (CronTrigger) trigger;  
                    String cronExpression = cronTrigger.getCronExpression();  
                    map.put("jobTime",cronExpression);
                }  
                jobList.add(map);  
            }  
        } catch (SchedulerException e) {
    
    
            e.printStackTrace();
        }  
        return jobList;  
    }

6、编写后台Job类实现job接口


public class FirstJob implements Job {
    
      

    private static Logger _log = LoggerFactory.getLogger(FirstJob.class);  

    public FirstJob() {
    
      

    }  

    public void execute(JobExecutionContext context)  
        throws JobExecutionException {
    
      
        _log.error("Hello Job执行时间: " + new Date());  

    }  
}  

6、后台测试容器监听器代码,主要用于在未开发前端增删改查页面,用于模拟数据包请求该功能使用。

 
/**
* 容器监听器
* @author jing
*/
public class QuartzJobListener implements ServletContextListener {
    
    

  @SuppressWarnings("unchecked")
  public void contextInitialized(ServletContextEvent arg0) {
    
    
      /***处理获取数据库的job表,然后遍历循环每个加到job中 ***/
      QuartzManager quartzManager = WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext()).getBean(QuartzManager.class);

      //此处就不写获取数据库了,模拟一个集合遍历的数据  
      List<Map<String,Object>> listMap=new ArrayList<>();
      Map<String, Object> map1=new HashMap<String, Object>();
      map1.put("jobClass","com.gsww.kfpt.web.controller.quartz.job.test.FirstJob");
      map1.put("jobName","job1");
      map1.put("jobGroupName","job1");
      map1.put("jobTime","0/5 * * * * ? ");
      listMap.add(map1);

      for (Map<String, Object> map : listMap) {
    
    
          try {
    
    
              quartzManager.addJob((Class<? extends Job>)(Class.forName((String)map.get("jobClass")).newInstance().getClass()),(String)map.get("jobName"), (String)map.get("jobGroupName"),(String)map.get("jobTime"));
          } catch (Exception e) {
    
    
              e.printStackTrace();
          } 
      }
      System.out.println("QuartzJobListener 启动了");
  }
  public void contextDestroyed(ServletContextEvent arg0) {
    
    
  	
  }
}

7、编写前端界面,主要包括列表,增删改查停启恢,页面如下,自行开发。
在这里插入图片描述
新增定时任务页面如下,添加任务:
在这里插入图片描述
点击保存,看到后台:
在这里插入图片描述
就算你服务重启,还重新载入你的定时任务,不会出现定时任务失效的情况。至此整个功能开发完毕。后台数据库如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lyy19931025/article/details/88643632