quartz之简单应用二

来源:互联网 发布:粉笔公考电脑版mac 编辑:程序博客网 时间:2024/05/20 23:36

quartz简单应用一后续

quartz简单应用一中的使用不便于管理,比如job详细信息,job的运行信息等等,所以我们来看看quartz更为方便的应用以及持久化。


一:持久化

持久化就需要把quartz的相关数据保存到数据库中,quartz其实自带了数据库表创建SQL,支持oracle,mysql等,下载quartz的包中可以找到,选择自己适合的应用。这里提供一份MySQL的SQL。 

SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for `qrtz_blob_triggers`-- ----------------------------DROP TABLE IF EXISTS `qrtz_blob_triggers`;CREATE TABLE `qrtz_blob_triggers` (  `SCHED_NAME` varchar(120) NOT NULL,  `TRIGGER_NAME` varchar(200) NOT NULL,  `TRIGGER_GROUP` varchar(200) NOT NULL,  `BLOB_DATA` blob,  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),  KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),  CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of qrtz_blob_triggers-- ------------------------------ ------------------------------ Table structure for `qrtz_calendars`-- ----------------------------DROP TABLE IF EXISTS `qrtz_calendars`;CREATE TABLE `qrtz_calendars` (  `SCHED_NAME` varchar(120) NOT NULL,  `CALENDAR_NAME` varchar(200) NOT NULL,  `CALENDAR` blob NOT NULL,  PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of qrtz_calendars-- ------------------------------ ------------------------------ Table structure for `qrtz_cron_triggers`-- ----------------------------DROP TABLE IF EXISTS `qrtz_cron_triggers`;CREATE TABLE `qrtz_cron_triggers` (  `SCHED_NAME` varchar(120) NOT NULL,  `TRIGGER_NAME` varchar(200) NOT NULL,  `TRIGGER_GROUP` varchar(200) NOT NULL,  `CRON_EXPRESSION` varchar(120) NOT NULL,  `TIME_ZONE_ID` varchar(80) DEFAULT NULL,  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),  CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of qrtz_cron_triggers-- ------------------------------ ------------------------------ Table structure for `qrtz_fired_triggers`-- ----------------------------DROP TABLE IF EXISTS `qrtz_fired_triggers`;CREATE TABLE `qrtz_fired_triggers` (  `SCHED_NAME` varchar(120) NOT NULL,  `ENTRY_ID` varchar(95) NOT NULL,  `TRIGGER_NAME` varchar(200) NOT NULL,  `TRIGGER_GROUP` varchar(200) NOT NULL,  `INSTANCE_NAME` varchar(200) NOT NULL,  `FIRED_TIME` bigint(13) NOT NULL,  `SCHED_TIME` bigint(13) NOT NULL,  `PRIORITY` int(11) NOT NULL,  `STATE` varchar(16) NOT NULL,  `JOB_NAME` varchar(200) DEFAULT NULL,  `JOB_GROUP` varchar(200) DEFAULT NULL,  `IS_NONCONCURRENT` varchar(1) DEFAULT NULL,  `REQUESTS_RECOVERY` varchar(1) DEFAULT NULL,  PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`),  KEY `IDX_QRTZ_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`),  KEY `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`),  KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),  KEY `IDX_QRTZ_FT_JG` (`SCHED_NAME`,`JOB_GROUP`),  KEY `IDX_QRTZ_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),  KEY `IDX_QRTZ_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of qrtz_fired_triggers-- ------------------------------ ------------------------------ Table structure for `qrtz_job_details`-- ----------------------------DROP TABLE IF EXISTS `qrtz_job_details`;CREATE TABLE `qrtz_job_details` (  `SCHED_NAME` varchar(120) NOT NULL,  `JOB_NAME` varchar(200) NOT NULL,  `JOB_GROUP` varchar(200) NOT NULL,  `DESCRIPTION` varchar(250) DEFAULT NULL,  `JOB_CLASS_NAME` varchar(250) NOT NULL,  `IS_DURABLE` varchar(1) NOT NULL,  `IS_NONCONCURRENT` varchar(1) NOT NULL,  `IS_UPDATE_DATA` varchar(1) NOT NULL,  `REQUESTS_RECOVERY` varchar(1) NOT NULL,  `JOB_DATA` blob,  PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),  KEY `IDX_QRTZ_J_REQ_RECOVERY` (`SCHED_NAME`,`REQUESTS_RECOVERY`),  KEY `IDX_QRTZ_J_GRP` (`SCHED_NAME`,`JOB_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of qrtz_job_details-- ------------------------------ ------------------------------ Table structure for `qrtz_locks`-- ----------------------------DROP TABLE IF EXISTS `qrtz_locks`;CREATE TABLE `qrtz_locks` (  `SCHED_NAME` varchar(120) NOT NULL,  `LOCK_NAME` varchar(40) NOT NULL,  PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of qrtz_locks-- ----------------------------INSERT INTO `qrtz_locks` VALUES ('scheduler', 'STATE_ACCESS');INSERT INTO `qrtz_locks` VALUES ('scheduler', 'TRIGGER_ACCESS');-- ------------------------------ Table structure for `qrtz_paused_trigger_grps`-- ----------------------------DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`;CREATE TABLE `qrtz_paused_trigger_grps` (  `SCHED_NAME` varchar(120) NOT NULL,  `TRIGGER_GROUP` varchar(200) NOT NULL,  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of qrtz_paused_trigger_grps-- ------------------------------ ------------------------------ Table structure for `qrtz_scheduler_state`-- ----------------------------DROP TABLE IF EXISTS `qrtz_scheduler_state`;CREATE TABLE `qrtz_scheduler_state` (  `SCHED_NAME` varchar(120) NOT NULL,  `INSTANCE_NAME` varchar(200) NOT NULL,  `LAST_CHECKIN_TIME` bigint(13) NOT NULL,  `CHECKIN_INTERVAL` bigint(13) NOT NULL,  PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of qrtz_scheduler_state-- ----------------------------INSERT INTO `qrtz_scheduler_state` VALUES ('scheduler', 'aishaonan0011510731271550', '1510734769659', '15000');-- ------------------------------ Table structure for `qrtz_simple_triggers`-- ----------------------------DROP TABLE IF EXISTS `qrtz_simple_triggers`;CREATE TABLE `qrtz_simple_triggers` (  `SCHED_NAME` varchar(120) NOT NULL,  `TRIGGER_NAME` varchar(200) NOT NULL,  `TRIGGER_GROUP` varchar(200) NOT NULL,  `REPEAT_COUNT` bigint(7) NOT NULL,  `REPEAT_INTERVAL` bigint(12) NOT NULL,  `TIMES_TRIGGERED` bigint(10) NOT NULL,  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),  CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of qrtz_simple_triggers-- ------------------------------ ------------------------------ Table structure for `qrtz_simprop_triggers`-- ----------------------------DROP TABLE IF EXISTS `qrtz_simprop_triggers`;CREATE TABLE `qrtz_simprop_triggers` (  `SCHED_NAME` varchar(120) NOT NULL,  `TRIGGER_NAME` varchar(200) NOT NULL,  `TRIGGER_GROUP` varchar(200) NOT NULL,  `STR_PROP_1` varchar(512) DEFAULT NULL,  `STR_PROP_2` varchar(512) DEFAULT NULL,  `STR_PROP_3` varchar(512) DEFAULT NULL,  `INT_PROP_1` int(11) DEFAULT NULL,  `INT_PROP_2` int(11) DEFAULT NULL,  `LONG_PROP_1` bigint(20) DEFAULT NULL,  `LONG_PROP_2` bigint(20) DEFAULT NULL,  `DEC_PROP_1` decimal(13,4) DEFAULT NULL,  `DEC_PROP_2` decimal(13,4) DEFAULT NULL,  `BOOL_PROP_1` varchar(1) DEFAULT NULL,  `BOOL_PROP_2` varchar(1) DEFAULT NULL,  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),  CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ------------------------------ Records of qrtz_simprop_triggers-- ------------------------------ ------------------------------ Table structure for `qrtz_triggers`-- ----------------------------DROP TABLE IF EXISTS `qrtz_triggers`;CREATE TABLE `qrtz_triggers` (  `SCHED_NAME` varchar(120) NOT NULL,  `TRIGGER_NAME` varchar(200) NOT NULL,  `TRIGGER_GROUP` varchar(200) NOT NULL,  `JOB_NAME` varchar(200) NOT NULL,  `JOB_GROUP` varchar(200) NOT NULL,  `DESCRIPTION` varchar(250) DEFAULT NULL,  `NEXT_FIRE_TIME` bigint(13) DEFAULT NULL,  `PREV_FIRE_TIME` bigint(13) DEFAULT NULL,  `PRIORITY` int(11) DEFAULT NULL,  `TRIGGER_STATE` varchar(16) NOT NULL,  `TRIGGER_TYPE` varchar(8) NOT NULL,  `START_TIME` bigint(13) NOT NULL,  `END_TIME` bigint(13) DEFAULT NULL,  `CALENDAR_NAME` varchar(200) DEFAULT NULL,  `MISFIRE_INSTR` smallint(2) DEFAULT NULL,  `JOB_DATA` blob,  PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`),  KEY `IDX_QRTZ_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`),  KEY `IDX_QRTZ_T_JG` (`SCHED_NAME`,`JOB_GROUP`),  KEY `IDX_QRTZ_T_C` (`SCHED_NAME`,`CALENDAR_NAME`),  KEY `IDX_QRTZ_T_G` (`SCHED_NAME`,`TRIGGER_GROUP`),  KEY `IDX_QRTZ_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`),  KEY `IDX_QRTZ_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),  KEY `IDX_QRTZ_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),  KEY `IDX_QRTZ_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`),  KEY `IDX_QRTZ_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`),  KEY `IDX_QRTZ_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`),  KEY `IDX_QRTZ_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`),  KEY `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_GROUP`,`TRIGGER_STATE`),  CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 二:quartz.properties配置

#==============================================================  #Configure Main Scheduler Properties  #==============================================================   org.quartz.scheduler.instanceName = TestScheduler1org.quartz.scheduler.instanceId = AUTO#==============================================================  #Configure ThreadPool  #==============================================================   org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount = 5org.quartz.threadPool.threadPriority = 5#==============================================================  #Configure JobStore  #==============================================================   org.quartz.jobStore.misfireThreshold = 60000org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.tablePrefix = QRTZ_org.quartz.jobStore.dataSource = myDS  org.quartz.jobStore.isClustered = trueorg.quartz.jobStore.clusterCheckinInterval = 15000#==============================================================  #Non-Managed Configure Datasource  #==============================================================

 第一块 调度器的属性,name是可以是自己定义的字符,如果是有多个调度器用来区分多个调度器,id属性给AUTH意思是自动生成一个唯一ID。

第二块 线程池配置 第一行处理job可以使用多少线程。第二行线程优先级,默认值值是5。

第三块 数据库配置 与上面的表相对应。

第四块 第一行打开集群设置。第二行 设置一个频度(毫秒),用于实例报告给集群中的其他实例。这会影响到侦测失败实例的敏捷度。它只用于设置了 isClustered 为 true 的时候。

更多可以参考 大佬的文章

三:spring-quartz.xml配置

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd"><!-- 声明任务工厂 -->      <bean id="scheduler" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">          <property name="dataSource" ref="dataSource" /><property name="configLocation" value="classpath:quartz.properties" /><property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>        </bean>      </beans>
 

四 Interface

import java.util.List;import com.wangsong.system.model.ScheduleJob;public interface ScheduleJobService{public void add(ScheduleJob scheduleJob);public List<ScheduleJob> getAllScheduleJob();public void modifyTrigger(ScheduleJob scheduleJob);public void restartJob(String[] name,String[] group);public void startNowJob(String[] name,String[] group);public void delJob(String[] name,String[] group);public void stopJob(String[] name,String[] group);}

 五 实现类

import java.util.ArrayList;import java.util.List;import java.util.Set;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.SchedulerException;import org.quartz.Trigger;import org.quartz.TriggerBuilder;import org.quartz.TriggerKey;import org.quartz.impl.matchers.GroupMatcher;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.wangsong.system.model.ScheduleJob;import com.wangsong.system.service.ScheduleJobService;@Servicepublic class ScheduleJobServiceImpl implements ScheduleJobService{@Autowiredprivate Scheduler scheduler;/** * 添加定时任务 * @param ScheduleJob */public void add(ScheduleJob scheduleJob){@SuppressWarnings("rawtypes")Class job = null;try {job = Class.forName(scheduleJob.getClassName());} catch (ClassNotFoundException e1) {e1.printStackTrace();}@SuppressWarnings("unchecked")JobDetail jobDetail = JobBuilder.newJob(job).withIdentity(scheduleJob.getName(), scheduleJob.getGroup()).build(); //表达式调度构建器(可判断创建SimpleScheduleBuilder)CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());jobDetail.getJobDataMap().put("scheduleJob", scheduleJob);//按新的cronExpression表达式构建一个新的triggerCronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(scheduleJob.getName(), scheduleJob.getGroup()).withSchedule(scheduleBuilder).build();try {scheduler.scheduleJob(jobDetail, trigger);} catch (SchedulerException e) {e.printStackTrace();}}/** * 获取所有计划中的任务 * @return 结果集合 */public List<ScheduleJob> getAllScheduleJob(){List<ScheduleJob> scheduleJobList=new ArrayList<ScheduleJob>();GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();try {Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);for (JobKey jobKey : jobKeys) {    List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);    for (Trigger trigger : triggers) {        ScheduleJob scheduleJob = new ScheduleJob();        scheduleJob.setName(jobKey.getName());        scheduleJob.setGroup(jobKey.getGroup());        Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());        scheduleJob.setStatus(triggerState.name());        //获取要执行的定时任务类名        JobDetail jobDetail=scheduler.getJobDetail(jobKey);    scheduleJob.setClassName(jobDetail.getJobClass().getName());  if (trigger instanceof CronTrigger) {CronTrigger cron = (CronTrigger) trigger;scheduleJob.setCronExpression(cron.getCronExpression());}        scheduleJobList.add(scheduleJob);    }}} catch (Exception e) {e.printStackTrace();}return scheduleJobList;}/** * 恢复任务 * @param name 任务名 * @param group 任务组 */public void restartJob(String[] name,String[] group){for(int i=0;i<name.length;i++){JobKey key = new JobKey(name[i], group[i]);try {scheduler.resumeJob(key);} catch (SchedulerException e) {e.printStackTrace();}}}/** * 立马执行一次任务 * @param name 任务名 * @param group 任务组 */public void startNowJob(String[] name,String[] group){for(int i=0;i<name.length;i++){JobKey jobKey = JobKey.jobKey(name[i], group[i]);try {scheduler.triggerJob(jobKey);} catch (SchedulerException e) {e.printStackTrace();}}}/** * 删除任务 * @param name 任务名 * @param group 任务组 */public void delJob(String[] name,String[] group){for(int i=0;i<name.length;i++){JobKey key = new JobKey(name[i], group[i]);try {scheduler.deleteJob(key);} catch (SchedulerException e) {e.printStackTrace();}}}/** * 修改触发器时间 * @param name 任务名 * @param group 任务组 * @param cron cron表达式 */public void modifyTrigger(ScheduleJob scheduleJob){try {              TriggerKey key = TriggerKey.triggerKey(scheduleJob.getName(), scheduleJob.getGroup());              //Trigger trigger = scheduler.getTrigger(key);                            CronTrigger newTrigger = (CronTrigger) TriggerBuilder.newTrigger()                      .withIdentity(key)                      .withSchedule(CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()))                      .build();              scheduler.rescheduleJob(key, newTrigger);          } catch (SchedulerException e) {              e.printStackTrace();          }  }/** * 暂停任务 * @param name 任务名 * @param group 任务组 */public void stopJob(String[] name,String[] group){for(int i=0;i<name.length;i++){JobKey key = new JobKey(name[i], group[i]);try {scheduler.pauseJob(key);} catch (SchedulerException e) {e.printStackTrace();}}}}

 六 entity

import java.io.Serializable;public class ScheduleJob implements Serializable {private static final long serialVersionUID = 7443454565979676171L;private String name;//任务名private String group;//任务组private String cronExpression;//cron表达式private String status;//状态private String className;//要执行的任务类路径名public ScheduleJob() {super();}public ScheduleJob(String name, String group, String cronExpression,String status, String description,String className) {super();this.name = name;this.group = group;this.cronExpression = cronExpression;this.status = status;this.className=className;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGroup() {return group;}public void setGroup(String group) {this.group = group;}public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public String getCronExpression() {return cronExpression;}public void setCronExpression(String cronExpression) {this.cronExpression = cronExpression;}public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}}

 六 业务处理类
import java.text.SimpleDateFormat;import java.util.Date;import org.quartz.DisallowConcurrentExecution;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import com.wangsong.system.model.ScheduleJob;@DisallowConcurrentExecution  public class TaskA implements Job {     public void execute(JobExecutionContext context) throws JobExecutionException {        ScheduleJob scheduleJob = (ScheduleJob)context.getMergedJobDataMap().get("scheduleJob");        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");        System.out.println("任务名称 = [" + scheduleJob.getName() + "]"+ " 在 " + dateFormat.format(new Date())+" 时运行");     }}

累了 累了......


原创粉丝点击