Quartz集群动态配置demo

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;

/*
 * <p>
 * This is just a simple job that gets fired off many times by example 1
 * </p>
 * 
 * @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;
	}
}


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- 调度任务 -->
	<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>
</beans>


猜你喜欢

转载自blog.csdn.net/lylhjh/article/details/52859263