spring3.X集成quartz2.X实现动态定时器

1.首先在Spring xml里定义

<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />

2.设置po类
public class TScheduleJob implements java.io.Serializable {

	



	// Fields
	private Integer FId;
	private String FJobName;
	private String FJobGroup;
	private String FJobStatus;
	private String FCronExpression;
	private String FBeanClass;
	private String FMethodName;
	private String FSpringId;
	private String FIsConcurrent;
	private String FDescription;
	private Integer FTimes;
	private Timestamp FReateTime;
	private Timestamp FUpdateTime;
//setter and getter
}
3.service类及其辅助类

@Service
@Qualifier("quatzService")
public class QuatzService implements ApplicationListener<ContextRefreshedEvent> {
	@Autowired
	private SchedulerFactoryBean schedulerFactoryBean;
	@Autowired
	private TScheduleJobDAO TScheduleJobDAO;

	public void getInit() throws Exception {
		System.out.println("init.....................................................................");
		// 这里从数据库中获取任务信息数据
		// List<TScheduleJob> jobList = new ArrayList<TScheduleJob>();
		// System.out.println("jobList size:" + jobList.size());
		// TScheduleJob scheduleJob = new TScheduleJob();
		// scheduleJob.setFBeanClass("com.landgent.service.logic.TimerLogicMgr");
		// scheduleJob.setFCronExpression("0/30 ?");
		// scheduleJob.setFJobGroup(Scheduler.DEFAULT_GROUP);
		// scheduleJob.setFId(1);
		// scheduleJob.setFJobName("updateYazhu");
		// scheduleJob.setFJobStatus(Constant.QUARTZ_STATUS_RUNNING);
		// scheduleJob.setFMethodName("updateYazhu");
		// scheduleJob.setFSpringId("timerLogicMgr");
		// jobList.add(scheduleJob);

		@SuppressWarnings("unchecked")
		List<TScheduleJob> jobList = TScheduleJobDAO.findAll();
		System.out.println("jobList size:" + jobList.size());
		for (TScheduleJob job : jobList) {
			System.out.println("jobName:"+job.getFJobName());
			addJob(job);
		}
	}

	/**
	 * 添加任务
	 * 
	 * @param TDbConfigQuartz
	 * @throws SchedulerException
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void addJob(TScheduleJob job) throws SchedulerException {
		if (job == null
				|| !Constant.QUARTZ_STATUS_RUNNING.equals(job.getFJobStatus())) {
			return;
		}

		Scheduler scheduler = schedulerFactoryBean.getScheduler();

		String jobGroup = StringUtils.isBlank(job.getFJobGroup()) ? Scheduler.DEFAULT_GROUP
				: job.getFJobGroup();
		// log.debug(scheduler +
		// ".......................................................................................add");
		TriggerKey triggerKey = TriggerKey.triggerKey(job.getFJobName(),
				jobGroup);

		CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);

		// 不存在,创建一个
		if (null == trigger) {
			Class clazz = Constant.QUARTZ_CONCURRENT_IS.equals(job
					.getFIsConcurrent()) ? QuartzJobFactory.class
					: QuartzJobFactoryDisallowConcurrentExecution.class;

			JobDetail jobDetail = JobBuilder.newJob(clazz)
					.withIdentity(job.getFJobName(), jobGroup).build();

			jobDetail.getJobDataMap().put("scheduleJob", job);

			CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
					.cronSchedule(job.getFCronExpression());

			trigger = TriggerBuilder.newTrigger()
					.withIdentity(job.getFJobName(), jobGroup)
					.withSchedule(scheduleBuilder).build();

			scheduler.scheduleJob(jobDetail, trigger);
		} else {
			// Trigger已存在,那么更新相应的定时设置
			CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
					.cronSchedule(job.getFCronExpression());

			// 按新的cronExpression表达式重新构建trigger
			trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
					.withSchedule(scheduleBuilder).build();

			// 按新的trigger重新设置job执行
			scheduler.rescheduleJob(triggerKey, trigger);
		}
	}

	@Override
	public void onApplicationEvent(ContextRefreshedEvent arg0) {
		// TODO Auto-generated method stub
		try {
			getInit();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}



/**
 * 
 * @Description: 计划任务执行处 无状态
 * @author ssk
 * @date 2015年12月30日11:29:12
 */
public class QuartzJobFactory implements Job {
	public final Logger log = Logger.getLogger(this.getClass());

	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		TScheduleJob scheduleJob = (TScheduleJob) context.getMergedJobDataMap().get("scheduleJob");
		TaskUtils.invokMethod(scheduleJob);
	}
}

/**
 * 
 * @Description: 若一个方法一次执行不完下次轮转时则等待改方法执行完后才执行下一次操作
 * @author ssk
 * @date 2015年12月30日10:12:40
 */
@DisallowConcurrentExecution
public class QuartzJobFactoryDisallowConcurrentExecution implements Job {
	public final Logger log = Logger.getLogger(this.getClass());

	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		TScheduleJob scheduleJob = (TScheduleJob) context.getMergedJobDataMap().get("scheduleJob");
		TaskUtils.invokMethod(scheduleJob);

	}
}


@Service
public class TaskUtils implements  BeanFactoryAware{
	public final static Logger log = Logger.getLogger(TaskUtils.class);

	private static BeanFactory beanFactory;
	
	/**
	 * 通过反射调用scheduleJob中定义的方法
	 * 
	 * @param scheduleJob
	 */
	public static void invokMethod(TScheduleJob scheduleJob) {
		Object object = null;
		Class clazz = null;
                //springId不为空先按springId查找bean
		if (StringUtils.isNotBlank(scheduleJob.getFSpringId())) {
			System.out.println("springid::::::::"+scheduleJob.getFSpringId());
			System.out.println("beanFactory======="+beanFactory);
			object = beanFactory.getBean(scheduleJob.getFSpringId());
		} else if (StringUtils.isNotBlank(scheduleJob.getFBeanClass())) {
			try {
				clazz = Class.forName(scheduleJob.getFBeanClass());
				object = clazz.newInstance();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		if (object == null) {
			log.error("任务名称 = [" + scheduleJob.getFJobName() + "]---------------未启动成功,请检查是否配置正确!!!");
			return;
		}
		clazz = object.getClass();
		Method method = null;
		try {
			method = clazz.getDeclaredMethod(scheduleJob.getFMethodName());
		} catch (NoSuchMethodException e) {
			log.error("任务名称 = [" + scheduleJob.getFJobName() + "]---------------未启动成功,方法名设置错误!!!");
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (method != null) {
			try {
				method.invoke(object);
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}

	@Override
	public void setBeanFactory(BeanFactory factory) throws BeansException {
		// TODO Auto-generated method stub
       beanFactory=factory;
	}

4.service操作类

@Service
@Scope("singleton")
public class QuatzOperationService{
	@Autowired
	private SchedulerFactoryBean schedulerFactoryBean;
	@Autowired
	private TScheduleJobDAO TScheduleJobDAO;

	/***
	 * 获取所有计划中的任务列表
	 * 
	 * @return
	 * @throws SchedulerException
	 */

	@SuppressWarnings("unchecked")
	public List<TScheduleJob> getAllJob() throws SchedulerException {
		List<TScheduleJob> jobList = TScheduleJobDAO.findAll();
		return jobList;
	}

	/**
	 * 所有正在运行的job
	 * 
	 * @return
	 * @throws SchedulerException
	 */

	public List<TScheduleJob> getRunningJob() throws SchedulerException {
		Scheduler scheduler = schedulerFactoryBean.getScheduler();
		List<JobExecutionContext> executingJobs = scheduler
				.getCurrentlyExecutingJobs();
		List<TScheduleJob> jobList = new ArrayList<TScheduleJob>(
				executingJobs.size());
		for (JobExecutionContext executingJob : executingJobs) {
			TScheduleJob job = new TScheduleJob();
			JobDetail jobDetail = executingJob.getJobDetail();
			JobKey jobKey = jobDetail.getKey();
			Trigger trigger = executingJob.getTrigger();
			job.setFJobName(jobKey.getName());
			job.setFJobGroup(jobKey.getGroup());
			job.setFDescription("触发器:" + trigger.getKey());
			Trigger.TriggerState triggerState = scheduler
					.getTriggerState(trigger.getKey());
			job.setFJobStatus(triggerState.name());
			if (trigger instanceof CronTrigger) {
				CronTrigger cronTrigger = (CronTrigger) trigger;
				String cronExpression = cronTrigger.getCronExpression();
				job.setFCronExpression(cronExpression);
			}
			jobList.add(job);
		}
		return jobList;
	}

	/**
	 * 暂停一个job
	 * 
	 * @param TTScheduleJob
	 * @throws SchedulerException
	 */
	public int upatePauseJob(TScheduleJob scheduleJob) throws SchedulerException {
		int i = TScheduleJobDAO.updateById(scheduleJob);
		if(i > 0){
			Scheduler scheduler = schedulerFactoryBean.getScheduler();
			JobKey jobKey = JobKey.jobKey(scheduleJob.getFJobName(),
					scheduleJob.getFJobGroup());
			scheduler.pauseJob(jobKey);
		}
		return i;
	}

	/**
	 * 恢复一个job
	 * 
	 * @param scheduleJob
	 * @throws SchedulerException
	 */

	public void resumeJob(TScheduleJob scheduleJob) throws SchedulerException {
		Scheduler scheduler = schedulerFactoryBean.getScheduler();
		JobKey jobKey = JobKey.jobKey(scheduleJob.getFJobName(),
				scheduleJob.getFJobGroup());
		scheduler.resumeJob(jobKey);
	}

	/**
	 * 删除一个job
	 * 
	 * @param scheduleJob
	 * 
	 * @throws SchedulerException
	 */
	public void deleteJob(TScheduleJob scheduleJob) throws SchedulerException {
		Scheduler scheduler = schedulerFactoryBean.getScheduler();
		JobKey jobKey = JobKey.jobKey(scheduleJob.getFJobName(),
				scheduleJob.getFJobGroup());
		scheduler.deleteJob(jobKey);

	}

	/**
	 * 立即执行job
	 * 
	 * @param scheduleJob
	 * @throws SchedulerException
	 */

	public void runAJobNow(TScheduleJob scheduleJob) throws SchedulerException {
		Scheduler scheduler = schedulerFactoryBean.getScheduler();
		JobKey jobKey = JobKey.jobKey(scheduleJob.getFJobName(),
				scheduleJob.getFJobGroup());
		scheduler.triggerJob(jobKey);
	}

	/**
	 * 更新job时间表达式
	 * 
	 * @param scheduleJob
	 * 
	 * @throws SchedulerException
	 */
	public void updateJobCron(TScheduleJob scheduleJob)
			throws SchedulerException {
		Scheduler scheduler = schedulerFactoryBean.getScheduler();

		TriggerKey triggerKey = TriggerKey.triggerKey(
				scheduleJob.getFJobName(), scheduleJob.getFJobGroup());

		CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);

		CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
				.cronSchedule(scheduleJob.getFCronExpression());

		trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
				.withSchedule(scheduleBuilder).build();

		scheduler.rescheduleJob(triggerKey, trigger);
	}



}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值