Quartz集群动态配置demo

101 阅读1分钟

controller+xml配置+class

package com.zihai.controller.test;

import static org.quartz.CronScheduleBuilder.cronSchedule; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger;

import org.apache.log4j.Logger; import org.quartz.CronTrigger; import org.quartz.Job; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.TriggerKey; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.quartz.SchedulerFactoryBean; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;

@Controller @RequestMapping("/quartz") public class QuartzTestController { private static Logger log = Logger.getLogger("SimpleJob");

@Autowired
private SchedulerFactoryBean bean;

@RequestMapping("/show")
public String showManager(){
	return "test/quartzManager";
}
@RequestMapping("/add")
public void add(String jobname,String group,String className,String triggerName){
	log.info("收到数据"+jobname+group+className+triggerName);
	try {
		Scheduler scheduler = bean.getScheduler();
		Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName(className);
		JobDetail job = newJob(jobClass).withIdentity(jobname, group).storeDurably(true).build();
		CronTrigger trigger = newTrigger().withIdentity(triggerName, group).withSchedule(cronSchedule("2 0/2 * * * ?")).build();
		scheduler.scheduleJob(job,trigger);
		  // 锟斤拷锟斤拷  
		if (!scheduler.isShutdown()) {  
			scheduler.start();  
		}
		
	} catch (ClassNotFoundException e) {
		log.error("没找到任务类");
		e.printStackTrace();
	} catch (SchedulerException e) {
		log.error("任务添加失败");
	} 
	log.info("任务添加成功");
}
@RequestMapping("/delete")
public void delete(String jobname,String group,String triggerName){
	log.info("收到数据"+jobname+group+triggerName);
	try {
		Scheduler scheduler = bean.getScheduler();
		scheduler.pauseTrigger(TriggerKey.triggerKey(triggerName, group));// 停止锟斤拷锟斤拷锟斤拷  
		scheduler.unscheduleJob(TriggerKey.triggerKey(triggerName, group));// 锟狡筹拷锟斤拷锟斤拷锟斤拷  
		scheduler.deleteJob(JobKey.jobKey(jobname, group));// 删锟斤拷锟斤拷锟斤拷 
		  // 锟斤拷锟斤拷  
		if (!scheduler.isShutdown()) {  
			scheduler.start();  
		}
	} catch (SchedulerException e) {
		log.error("失败");
	}
	log.info("成功");
}

}

package com.zihai.schedule;

import java.util.Date;

import org.apache.log4j.Logger; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.springframework.scheduling.quartz.QuartzJobBean;

/*

  • This is just a simple job that gets fired off many times by example 1

  • @author Bill Kratzer */ public class SimpleJob extends QuartzJobBean {

    private static Logger _log = Logger.getLogger("SimpleJob");

/* Quartz requires a public empty constructor so that the scheduler can instantiate the class whenever it needs.*/

public SimpleJob() {
}

@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
	 JobKey jobKey = context.getJobDetail().getKey();
        _log.info("SimpleJob says: " + jobKey + " executing at " + new Date());
	
}

}

package com.zihai.schedule;

import org.quartz.spi.TriggerFiredBundle; /import org.quartz.spi.TriggerFiredBundle;/ import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.scheduling.quartz.SpringBeanJobFactory;

/**

  • Autowire Quartz Jobs with Spring context dependencies
  • @see http
  •  ://stackoverflow.com/questions/6990767/inject-bean-reference-into-a-quartz
    
  •  -job-in-spring/15211030#15211030
    

*/ public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {

private transient AutowireCapableBeanFactory beanFactory;

public void setApplicationContext(final ApplicationContext context) {
	beanFactory = context.getAutowireCapableBeanFactory();
}

@Override
protected Object createJobInstance(final TriggerFiredBundle bundle)
		throws Exception {
	final Object job = super.createJobInstance(bundle);
	beanFactory.autowireBean(job);
	System.out.println("AutowiringSpringBeanJobFactory-------------------");
	return job;
}

}

<!-- 调度任务 -->
<bean id="jobDetail"
		class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
		<property name="jobClass" value="com.zihai.schedule.SimpleJob" />
		<property name="durability" value="true"/>
		<!-- <property name="shouldRecover" value="true" /> -->
</bean>

<!-- 调试触发器 -->
<bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
	<property name="jobDetail" ref="jobDetail" />
	<property name="cronExpression">
		<value>0 0/2 * * * ?</value>
	</property>
	<property name="timeZone">
		<value>GMT+8:00</value>
	</property>
</bean>
<!-- 调度工厂 -->
<bean id="scheduler" lazy-init="false" 
	class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	
	<!-- 注册JobDetails -->
	<property name="jobDetails">
		<list>
			<!-- <ref bean="jobDetail"/> -->
		</list>
	</property>
	<!-- 注册triggers -->
	<property name="triggers">
		<list>
			<!-- <ref bean="trigger" /> -->
		</list>
	</property>
	<property name="jobFactory">
		<bean class="com.zihai.schedule.AutowiringSpringBeanJobFactory" />
	</property>
	
	<!--可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 -->
	<property name="overwriteExistingJobs" value="true"/>
	
	<property name="autoStartup" value="true" />
	
	<property name="schedulerName" value="quartzScheduler" />
	
	<!-- <property name="transactionManager" ref="transManager" /> -->
	
	<!-- <property name="configLocation" value="classpath:quartz.properties" /> -->
	<!-- 属性 -->
	<property name="quartzProperties">
		<props>
			<!-- 集群要求必须使用持久化存储 -->
			<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreCMT</prop>
			
			<prop key="org.quartz.scheduler.instanceName">EventScheduler</prop>
			<!-- 每个集群节点要有独立的instanceId -->
			<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
			
			<!-- Configure ThreadPool -->
			<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
			<prop key="org.quartz.threadPool.threadCount">2</prop><!-- 50 -->
			<prop key="org.quartz.threadPool.threadPriority">5</prop><!-- 5 -->
			<prop key="org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread">true</prop>
			<!-- Configure JobStore -->
			<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
			<prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
			<prop key="org.quartz.jobStore.tablePrefix">qrtz_</prop>
			<prop key="org.quartz.jobStore.maxMisfiresToHandleAtATime">10</prop>
			<!-- 开启集群 -->
			<prop key="org.quartz.jobStore.isClustered">true</prop>
			<prop key="org.quartz.jobStore.clusterCheckinInterval">20000</prop>
			<prop key="org.quartz.jobStore.dontSetAutoCommitFalse">true</prop>
			<prop key="org.quartz.jobStore.txIsolationLevelSerializable">false</prop>
			<prop key="org.quartz.jobStore.dataSource">myDS</prop>
			<prop key="org.quartz.jobStore.nonManagedTXDataSource">myDS</prop>
			<prop key="org.quartz.jobStore.useProperties">false</prop>
			<!-- Configure Datasources  -->
			<prop key="org.quartz.dataSource.myDS.driver">${db.driver}</prop>
			<prop key="org.quartz.dataSource.myDS.URL">${db.url2}</prop>
			<prop key="org.quartz.dataSource.myDS.user">${db.username}</prop>
			<prop key="org.quartz.dataSource.myDS.password">${db.password}</prop>
			<prop key="org.quartz.dataSource.myDS.maxConnections">2</prop><!-- 10 -->
			<prop key="org.quartz.dataSource.myDS.validationQuery">select 0 from dual</prop>
		</props>
	</property>
	<property name="applicationContextSchedulerContextKey" value="applicationContext" />
</bean>