`
征途2010
  • 浏览: 243647 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

quartz集成spring集群部署

阅读更多

由于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>

 

 

分享到:
评论

相关推荐

    spring+quartz

    1,如果只是集成spring和quartz,则只需要jar包,和编写配置文件,即可。 2,如果考虑集群部署,会用到tables_mysql.sql。

    Spring.3.x企业应用开发实战(完整版).part2

    16.4.2 集成Spring 16.4.3 集成Hibernate 16.4.4 集成Dbunit 16.4.5 自定义扩展模块 16.5 使用Unitils测试DAO层 16.5.1 数据库测试的难点 16.5.2 扩展Dbunit用Excel准备数据 16.5.3 测试实战 16.6 使用unitils测试...

    Spring3.x企业应用开发实战(完整版) part1

    16.4.2 集成Spring 16.4.3 集成Hibernate 16.4.4 集成Dbunit 16.4.5 自定义扩展模块 16.5 使用Unitils测试DAO层 16.5.1 数据库测试的难点 16.5.2 扩展Dbunit用Excel准备数据 16.5.3 测试实战 16.6 使用unitils测试...

    CRMEB小程序商城 JAVA_v2.0公测版,CRMEB_JAVA_BETA_v2.0(20211211).zip

    java代码分包 商城和管理api分别部署,可实现集群。 webPC管理端 UI大更新,有风格和更多菜单布局 。 webPC 管理端 操作步骤新增 新手安装引导(更加清晰明了)。 webPC 管理端 新增 行为验证码 增强账户安全。 Java...

    CRMEB 【Java版】单商户商城系统v2.0(20211225)(完整包)

    java代码分包 商城和管理api分别部署,可实现集群。 webPC管理端 UI大更新,有风格和更多菜单布局 。 webPC 管理端 操作步骤新增 新手安装引导(更加清晰明了)。 webPC 管理端 新增 行为验证码 增强账户安全。 Java...

    Active4j-oa办公系统-其他

    基于springboot2.0,以Spring Framework为核心容器,Spring MVC为模型视图控制器,Mybatis Plus为数据访问层, Apache Shiro为权限授权层, Redis为分布式缓存,Quartz为分布式集群调度,JSP作为前端页面引擎,采用...

    Active4j-boot快速开发框架-其他

    6、支持分布式部署,session集成了redis7、灵活的权限控制, 整合shiro,可控制到页面或按钮,满足绝大部分的权限需求,优化权限注解方便权限配置8、日志记录采用aop(LogAop类)方式,可对用户所有操作进行记录9、引入...

    SpringBoot_shardDB_shardTable:SpringBoot集成Sharding-JDBC实现分库分表,自定义分片算法,基于一致性hash算法,易于扩容

    项目信息:此项目是基于SpringBoot的,并在其基础上设计了 RestFul 风格的接口 。除此之外,还整合了其它的功能:整合了swagger生成在线的接口文档,并且实现统一格式的...实现了 reids 分布式锁 ,当项目部署集群时,

    单点登录源码

    Spring+SpringMVC+Mybatis框架集成公共模块,包括公共配置、MybatisGenerator扩展插件、通用BaseService、工具类等。 &gt; zheng-admin 基于bootstrap实现的响应式Material Design风格的通用后台管理系统,`zheng`...

    Java毕业设计-JAVA办公自动化系统(源代码+论文+外文翻译).rar

    4. **Quartz**:一个功能丰富的任务调度库,支持定时任务、集群和持久化。 5. **Redis**:一个高性能的键值存储数据库,用于缓存和Session管理。 该系统具有以下特点: 1. **模块化设计**:系统采用模块化设计,...

Global site tag (gtag.js) - Google Analytics