由于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. C# pythonnet(2)_傅里叶变换(FFT)

    Python代码如下 import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取数据 data = pd.r ...

  2. 异构智联Wi-Fi6+蓝牙模组,重新定义多屏互联体验!

    下班回家打开门,电灯.电视.空调.音响.电动窗帘.扫地机器人--一呼百应,有序开工,原本冰冷的房子立刻变成了温暖港湾.可以说,舒适便捷的智能设备已经完全融入了我们的生活中. 从单一场景.单一设备,到现 ...

  3. 【Hadoop】Hadoop集群组件默认端口

    这里包含使用到的组件:HDFS, YARN, HBase, Hive, ZooKeeper: 组件 节点 默认端口 配置 用途说明 HDFS DataNode 50010 dfs.datanode.a ...

  4. 使用Jest和React Test library 进行React单元测试

    React单元测试,就是把React 组件渲染出来,看看渲染出来的内容符不符合我们的预期.比如组件加载的时候有loading, 那就渲染组件,看看渲染出的内容中有没有loading. 再比如,ajax ...

  5. P9376 题解

    首先考虑怎么暴力. 考虑把每个数进行 \(B\) 进制分解,然后我们惊奇的发现这两个操作就是把最低位去掉和往最低位后面插入一个数. 然后我们顺藤摸瓜,把每个数的分解扔到 Trie 树上,我们发现我们要 ...

  6. Intellij IDEA 'Error:java: 无效的源发行版:13'

    第一步,依次点击,File - Settings - Bulid, Execution,Deployment - Compiler - Java Compiler,修改版本为13(你使用的java是哪 ...

  7. Solo 开发者周刊 (第6期):仅需一个动作,秒变时间管理大师?

    这里会整合 Solo 社区每周推广内容.产品模块或活动投稿,每周五发布.在这期周刊中,我们将深入探讨开源软件产品的开发旅程,分享来自一线独立开发者的经验和见解.本杂志开源,欢迎投稿. 产品推荐 1. ...

  8. 2024 暑假友谊赛-热身1(7.11)zhaosang

    A-A https://vjudge.net/contest/639453#problem/A 为了解决这个问题,我们需要确定将墙上的所有数字转换为数字1的最小成本.将数字i转换成数字j的代价由矩阵c ...

  9. python 列表append和 的区别??

    python列表中的合并 python列表中append方法是给列表增加一个元素,而'+='是增加上该符号后边的元素,类似于extend方法 不知道对错,先记下来.我学的append方法是在列表最后追 ...

  10. CSP-S提高组数据结构算法模板大合集

    CSP-S 算法总结 2.2.1 基础知识与编程环境 无 2.2.2 C++ 程序设计 2 set/nultiset map/multimap deque/priority_queue STL 2.2 ...