由于quartz单节点无法满足业务的需求,后面我们在单节点的基础上进行了集群部署。

由以前的定时任务信息放在jobs.xml配置文件中,转而放到数据库中。

1、新建数据库表

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,
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);

2、 quartz.properties文件修改

以前该配置不是放在classpath下,修改后需要将改配置放在classpath下

#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.instanceId = AUTO #============================================================================
# Configure ThreadPool
#============================================================================ org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5 #============================================================================
# Configure JobStore
#============================================================================ org.quartz.jobStore.misfireThreshold = 60000 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
##org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = myDS
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false #============================================================================
# Configure Datasources
#============================================================================ #org.quartz.dataSource.myDS.driver = org.postgresql.Driver
#org.quartz.dataSource.myDS.URL = jdbc:postgresql:dev
#org.quartz.dataSource.myDS.user = jhouse
#org.quartz.dataSource.myDS.password =
#org.quartz.dataSource.myDS.maxConnections = 5
#org.quartz.dataSource.myDS.validationQuery = select lock_name from qrtz_locks where lock_name = 'TRIGGER_ACCESS'; #============================================================================
# Configure Plugins
#============================================================================ # Uncomment the following to get logging of job execution events...
#org.quartz.plugin.jobHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin # Uncomment the following to get logging of trigger firing events...
#org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin #org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
#org.quartz.plugin.jobInitializer.fileName = jobs.xml
#org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
#org.quartz.plugin.jobInitializer.failOnFileNotFound = true
#org.quartz.plugin.jobInitializer.useContextClassLoader = true
#org.quartz.plugin.jobInitializer.validating = false
#org.quartz.plugin.jobInitializer.validatingSchema = true
#org.quartz.plugin.jobInitializer.scanInterval = 1800 #============================================================================
# Configure Listeners
#============================================================================ #org.quartz.jobListener.dummy.class = org.quartz.examples.DumbJobListener

3、与spring集成

修改applicationContext.xml,添加如下配置

<!-- 声明工厂 -->
<bean id="bdcscheduler" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="schedulerName" value="BdcQuartzScheduler"/>
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:quartz.properties" />
<!--applicationContextSchedulerContextKey:
是org.springframework.scheduling.quartz.SchedulerFactoryBean这个类中
把spring上下 文以key/value的方式存放在了quartz的上下文中了,
可以用applicationContextSchedulerContextKey所定义的key得到对应的spring上下文-->
<property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>
</bean>

4、添加监听器

由于需要对触发器的执行情况进行监控所以在servlet初始化时添加了监听器。

private void initQuartz(ServletConfig cfg) {
System.out.println("Quartz 开始初始化...");
try {
//启动调度
scheduler = (Scheduler)BeanLocator.getBeanInstance("bdcscheduler");
TriggerListener myListener=new MonitorTriggerListener();
scheduler.addGlobalTriggerListener(myListener);
System.out.println("名称为 " + scheduler.getSchedulerName() + "的任务调度启动正常");
} catch (Exception e) {
System.out.println("Quartz 初始化异常: " + e.toString());
logger.error(e);
}
}

5、将原有jobs.xml中的job配置信息初始化到数据库

首先解析jobs.xml,然后初始化成jobdetail和crontrigger,依次执行scheduler.scheduleJob

public static List<SimsJob> filterJobXmlFile() throws Exception {
String configFileName = "jobs.xml";
String jobXmlFileFullName = ConfigContext.getFullConfigPath("quartz",configFileName);
// String jobXmlFileFullName = ConfigurationHelper.getFullFileName(configFile);
List<SimsJob> simsJobList = new ArrayList<SimsJob>();
logger.debug("构造文档对象(对xml 文件进行解析)");
// 构造文档对象(对xml 文件进行解析)
Document doc = FeatureFilterUtils.parseXMLFile(jobXmlFileFullName);
Element root = doc.getRootElement(); // 判断是否存在命名空间,如果有命名空间就应该根据命名空间取得子节点 Namespace namespace = root.getNamespace();
root.removeNamespaceDeclaration(namespace);
// root.setNamespace(null); // 根据feature配置进行过滤取得关闭的feature列表(包含停止JOB运行的所有配置项)
// removeFeatureClose(root, namespace); @SuppressWarnings("unchecked")
List<Element> list = root.getChildren("job",namespace);
for (Element element : list) {
SimsJob simsJob = new SimsJob();
@SuppressWarnings("unchecked")
List<Element> eleList = element.getChildren("job-detail",namespace);
Map<String,String> paraMap = new HashMap<String,String>();
for (Element ele : eleList) {
simsJob.setName(ele.getChild("name",namespace).getValue());
simsJob.setGroup(ele.getChild("group",namespace).getValue());
simsJob.setJobClass(ele.getChild("job-class",namespace).getValue());
simsJob.setVolatility(ele.getChild("volatility",namespace).getValue());
simsJob.setDurability(ele.getChild("durability",namespace).getValue());
simsJob.setRecover(ele.getChild("recover",namespace).getValue());
Element ele1 =ele.getChild("job-data-map",namespace);
if(ele1==null){
continue;
}
List<Element> ele2List = ele1.getChildren("entry",namespace);
for (Element ele3 : ele2List) {
String key = ele3.getChild("key",namespace).getValue();
String value = ele3.getChild("value",namespace).getValue();
paraMap.put(key, value);
}
}
simsJob.setParaMap(paraMap);
simsJob.setServiceName(paraMap.get("serviceName"));
String jobDesc = paraMap.get("desc");
if(StringUtils.isEmpty(jobDesc)){
jobDesc="没设置job描述,以名称代替:"+simsJob.getName();
}
simsJob.setDesc(jobDesc);
Element trigger = element.getChild("trigger",namespace);
@SuppressWarnings("unchecked")
List<Element> triggerList = trigger.getChildren();
for (Element ele : triggerList) {
simsJob.setTriggerName(ele.getChild("name",namespace).getValue());
simsJob.setTriggerGroup(ele.getChild("group",namespace).getValue());
simsJob.setTriggerCronExpression(ele
.getChild("cron-expression",namespace).getValue());
}
simsJobList.add(simsJob);
}
return simsJobList;
}
/**
* 初始化xml配置到数据库
* initDbQuartz
* @param mapping
* @param form
* @param request
* @return
*/
public voidinitDbQuartz(ActionMapping mapping, ActionForm form, HttpServletRequest request) {
List<SimsJob> jobList = null;
try {
jobList = SimsJobXmlUtil.filterJobXmlFile();
for (SimsJob simsJob : jobList) {
Class ownerClass = Class.forName(simsJob.getJobClass());
Constructor constructor = ownerClass.getConstructor();
Job job = (Job) constructor.newInstance();
// 执行一下JOB
Scheduler scheduler = (Scheduler) BeanLocator.getBeanInstance("bdcscheduler");
TriggerListener myListener = new MonitorTriggerListener();
scheduler.addGlobalTriggerListener(myListener);
JobDetail jobDetail =
new JobDetail(simsJob.getName(), simsJob.getGroup(), job.getClass(), BooleanUtils.toBoolean(simsJob
.getVolatility()), BooleanUtils.toBoolean(simsJob.getDurability()),
BooleanUtils.toBoolean(simsJob.getRecover()));
jobDetail.setDescription(simsJob.getDesc());
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.putAll(simsJob.getParaMap());
jobDetail.setJobDataMap(jobDataMap);
Trigger trigger =
new CronTrigger(simsJob.getTriggerName(), simsJob.getTriggerGroup(), simsJob.getName(),
simsJob.getGroup(), simsJob.getTriggerCronExpression());
trigger.setDescription(simsJob.getDesc());
scheduler.scheduleJob(jobDetail, trigger);
}
} catch (Exception e) {
logger.error("列表出Job对象 listSimsJobs 出错", e);
e.printStackTrace();
}
}

6、手动执行

所谓手动执行就是new一个simpletrigger来执行一次job,如下:

public static void runJob(String jobName) {
logger.debug("执行选择的Job对象 doRunSimsJob runName:" + jobName);
try {
// 执行一下JOB
Scheduler scheduler = (Scheduler) BeanLocator.getBeanInstance("bdcscheduler");
SimsJob simsJob = null;
boolean existFlag = false;
if (jobName != null && !"".equals(jobName)) {
// 通过调度器对象scheduler获取所有触发器组名称数组TriggerGroupNames
String[] triggerGroups = scheduler.getTriggerGroupNames(); for (int i = 0; i < triggerGroups.length; i++) {// 遍历每个触发器组名数组,得到每组所有触发器
String groupName = triggerGroups[i];
// 根据触发器组名获得该组所有触发器名称数组
String[] triggerNames = scheduler.getTriggerNames(groupName);
for (int j = 0; j < triggerNames.length; j++) {// 遍历每个触发器名数组,得到当前组所有触发器
if (existFlag) {
break;
}
simsJob = new SimsJob();
String triggerName = triggerNames[j];
// 根据触发器名称获得触发器对象
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerName, groupName);
if (jobName.equals(trigger.getJobName())) {
// 对每个触发器对象TriggerDTO设属性值
simsJob.setDesc(trigger.getDescription());
simsJob.setGroup(trigger.getJobGroup());
simsJob.setName(trigger.getJobName());
JobDetail jobdetail=scheduler.getJobDetail(trigger.getJobName(), trigger.getJobGroup());
simsJob.setJobClass(jobdetail.getJobClass().getName());
simsJob.setParaMap(jobdetail.getJobDataMap());
simsJob.setTriggerGroup(trigger.getGroup());
simsJob.setTriggerName(trigger.getName());
simsJob.setTriggerCronExpression(trigger.getCronExpression());
existFlag = true;
} }
if (existFlag) {
break;
}
}
}
if (existFlag) {
Class clazz=Class.forName(simsJob.getJobClass());
// 实例化控制的Job
Constructor constructor = clazz.getConstructor();
Job job = (Job) constructor.newInstance();
TriggerListener myListener = new MonitorTriggerListener();
scheduler.addGlobalTriggerListener(myListener);
JobDetail jobDetail = new JobDetail(simsJob.getName(), Scheduler.DEFAULT_GROUP, job.getClass());
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.putAll(simsJob.getParaMap());
jobDetail.setJobDataMap(jobDataMap);
Trigger trigger =
new SimpleTrigger(simsJob.getTriggerName(), Scheduler.DEFAULT_GROUP, new Date(), null, 0, 0L);
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
logger.error("执行选择的Job对象:" + simsJob.getName() + "已经开始执行,稍后请检查数据!");
} else {
logger.error("执行选择的Job对象出错:该Job不存在于Job配置文件中,请确认Job 名称是否正确!");
}
} catch (Exception e) {
logger.error("doRunSimsJob 执行选择的Job对象出错", e);
e.printStackTrace();
}
}

7、升级quartz

由于我们用的spring版本是3.2.16,而spring3.2.16中org.springframework.scheduling.quartz.CronTriggerBean继承了org.quartz.CronTrigger(public class CronTriggerBeanextends CronTrigger),而在quartz2.3.3中org.quartz.CronTrigger是个接口(publicabstract interface CronTrigger extends Trigger),而我们系统中有部分的类库中用到了CronTriggerBean,继承了CronTriggerBean,导致升级到最新版本quartz2.3.3时报错,所以只升级到了quartz1.8.6。

这里特别要注意的是quartz升级到1.8.6后如果任然需要使用xml的话,会和1.6版本有很大区别。如下

1.6版本如下:

<?xml version="1.0" encoding="gb2312"?>
<quartz xmlns="http://www.opensymphony.com/quartz/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opensymphony.com/quartz/JobSchedulingData
http://www.opensymphony.com/quartz/xml/job_scheduling_data_1_5.xsd"
version="1.5">
<calendar class-name="org.quartz.impl.calendar.HolidayCalendar" replace="true">
<name>holidayCalendar</name>
<description>HolidayCalendar</description>
<base-calendar class-name="org.quartz.impl.calendar.WeeklyCalendar">
<name>weeklyCalendar</name>
<description>WeeklyCalendar</description>
<base-calendar class-name="org.quartz.impl.calendar.AnnualCalendar">
<name>annualCalendar</name>
<description>AnnualCalendar</description>
</base-calendar>
</base-calendar>
</calendar>
<!-- uspc数据字典缓存加载任务 -->
<job>
<job-detail>
<name>DataDictionaryCache</name>
<group>taskGroup</group>
<job-class>com.aspire.sims.uspc.platform.job.ScheduleServiceProcessor</job-class>
<volatility>false</volatility>
<durability>false</durability>
<recover>false</recover>
<job-data-map allows-transient-data="true">
<entry>
<key>serviceName</key>
<value>dataDictionaryCache</value>
</entry>
<entry>
<key>desc</key>
<value>uspc数据字典缓存加载任务</value>
</entry>
</job-data-map>
</job-detail>
<trigger>
<cron>
<name>DataDictionaryCacheTrigger</name>
<group>triggerGroup</group>
<job-name>DataDictionaryCache</job-name>
<job-group>taskGroup</job-group>
<cron-expression>0 0 23 * * ?</cron-expression>
</cron>
</trigger>
</job>
</quartz>

而下面的则是1.8.6

<?xml version="1.0" encoding="gb2312"?>
<job-scheduling-data
xmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
version="1.8">
<schedule>
<!-- sims审批催办提醒job -->
<job>
<name>approveNotifyJob</name>
<group>approveNotifyJob_group</group>
<description>集成sims审批催办提醒job</description>
<job-class>com.aspire.bdc.common.job.ApproveNotifyJob</job-class>
<volatility>false</volatility>
<durability>false</durability>
<recover>false</recover>
<job-data-map>
<entry>
<key>remind_spserv</key>
<value>spServApproveNotifyService</value>
</entry>
</job-data-map>
</job>
<trigger>
<cron>
<name>cronTrigger_approveNotifyJob</name>
<group>triggerGroup</group>
<description>集成sims审批催办提醒定时器</description>
<job-name>approveNotifyJob</job-name>
<job-group>approveNotifyJob_group</job-group>
<cron-expression>0 30 15 ? * MON,WED,FRI </cron-expression>
</cron>
</trigger>
</schedule>
</job-scheduling-data>

quartz集成spring集群部署的更多相关文章

  1. Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目

    在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集 ...

  2. HBase集成Zookeeper集群部署

    大数据集群为了保证故障转移,一般通过zookeeper来整体协调管理,当节点数大于等于6个时推荐使用,接下来描述一下Hbase集群部署在zookeeper上的过程: 安装Hbase之前首先系统应该做通 ...

  3. quartz.net实现集群部署的笔记

    一..表信息 QRTZ_CALENDARS 以 Blob 类型存储 Quartz 的 Calendar 信息 QRTZ_CRON_TRIGGERS 存储 Cron Trigger,包括Cron表达式和 ...

  4. Spring Cloud Alibaba | Nacos集群部署

    目录 Spring Cloud Alibaba | Nacos集群部署 1. Nacos支持三种部署模式 2. 集群模式下部署Nacos 2.1 架构图 2.2 下载源码或者安装包 2.3 配置集群配 ...

  5. Spring Boot集成Redis集群(Cluster模式)

    目录 集成jedis 引入依赖 配置绑定 注册 获取redis客户端 使用 验证 集成spring-data-redis 引入依赖 配置绑定 注册 获取redis客户端 使用 验证 异常处理 同样的, ...

  6. Quartz.net持久化与集群部署开发详解

    序言 我前边有几篇文章有介绍过quartz的基本使用语法与类库.但是他的执行计划都是被写在本地的xml文件中.无法做集群部署,我让它看起来脆弱不堪,那是我的罪过. 但是quart.net是经过许多大项 ...

  7. 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】

    一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz强大的序列化机制,可以序列到 sqlserver,mysql,当然还可以在 ...

  8. Spring Boot+redis存储session,满足集群部署、分布式系统的session共享

    本文讲述spring-boot工程中使用spring-session机制进行安全认证,并且通过redis存储session,满足集群部署.分布式系统的session共享. 原文链接:https://w ...

  9. Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)

    Spring整合Quartz定时任务 在集群.分布式系统中的应用(Mysql数据库环境)   转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Q ...

  10. Spring整合Quartz定时任务 在集群、分布式系统中的应用

    概述 虽然单个Quartz实例能给予你很好的Job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成为你应用的一 ...

随机推荐

  1. FFmpeg变速处理视频文件

    使用工具:小丸工具箱,HandBrake,FFmpeg 首先确定视频是否为VFR(可变帧率),如果是VFR需要在二次处理前转换成CFR(固定帧率) VFR转换CFR可以使用FFmpeg命令行或Hand ...

  2. 【Ubuntu 1】ubuntu的软件包及便携系列 记录

    目录 命令行补充[备注记录] 不想每次---- source /devel/setup.bash sudo chomd 777 /dev/ttyUSB* 安装区 --- 强推!Synergy Chro ...

  3. spark共享变量---广播变量和累加变量

    从三个方面来分析:1.什么时候使用,2.原理是什么3.性能上有什么优化 累加变量:--(自定义累加器很重要) 使用场景:累加器的一个常见用途是在调试时对作业执行过程中的事件进行计数,如:统计日志中空行 ...

  4. pyside6 QThread 以及自定义信号 测试

    import sys import random from time import sleep from PySide6 import QtCore as qc from PySide6 import ...

  5. 对于 vue3.0 特性你有什么了解的吗?

    Vue 3.0 的目标是让 Vue 核心变得更小.更快.更强大,因此 Vue 3.0 增加以下这些新特性: (1)监测机制的改变3.0 将带来基于代理 Proxy 的 observer 实现,提供全语 ...

  6. yb课堂之用户下单模块开发 《十四》

    开发用户下单购买视频接口 VideoOrder模块下单接口开发 VideoOrderController.java package net.ybclass.online_ybclass.control ...

  7. oeasy教您玩转vim - 89 - # 高亮细节Highlight

    ​ 高亮细节 highight 回忆 这个自动命令 autocmd 还是很方便的 打开时.保存时就会有自动执行的操作 自动命令有这么几大元素 {event} 触发事件 {pattern} 文件模式 { ...

  8. java中的Context

    在java编程中,上下文(Context)是指程序运行时的环境和状态的集合.包括了类对象变量方法等运行时的相关数据 在类中,我们可以通过this获取当前类的变量.方法的上下文, 例如getset方法: ...

  9. docker 容器卷

    创建各种卷 [root@docker ~]# docker volume create mqy-vo101 mqy-vo101 [root@docker ~]# docker inspect mqy- ...

  10. 02 IO口的操作

    目录 前言 一.IO的概念 1.IO接口 2.IO端口 二.CPU和外设进行数据传输的方法 1.程序控制方式 1.1 无条件 1.2 查询方式 2.中断方式 3.DMA方式 一.方法介绍和代码编写 1 ...