Quartz调度实践

一个典型的quartz调度做法(不结合spring)

首先声明一个类继承Job接口,将来quartz会调度这个类的execute
	public class UpdateConfigurationTask implements Job{
		public void execute(JobExecutionContext context) throws JobExecutionException {
			try
			{
				if(!ClientManager.hasInit())
				{
					ClientManager.init();
				}
				ClientManager.updateConfig();
			}
			catch(Exception ex)
			{
				LogWriter.writeErrorLog("从统一配置平台更新配置失败"+ex.getMessage());
			}
		}
	}

定义JobDetail,用以设置Job的各种属性
	JobDetail jobDetail = new JobDetail("updateConfigurationTask","jGroup1", UpdateConfigurationTask.class);

 

定义一个Trigger

	SimpleTrigger simpleTrigger = new SimpleTrigger("ConfigurationCenterTrigger","group1");


设置trigger的属性,主要是运行周期,时间,间隔等

	simpleTrigger.setStartTime(new Date());
	simpleTrigger.setRepeatInterval(150000);
	simpleTrigger.setRepeatCount(org.quartz.SimpleTrigger.REPEAT_INDEFINITELY);

从SchedulerFactory获取一个Scheduler对象
	SchedulerFactory schedulerFactory = new StdSchedulerFactory();
	Scheduler scheduler = schedulerFactory.getScheduler();

 使用定义的Trigger调度定义的JobDetail
	scheduler.scheduleJob(jobDetail, simpleTrigger);
	scheduler.start();

那么Spring是如何做的呢

首先依然是一个作业类,不过不需要继承Job接口了
接下是定义JobDetail,MethodInvokingJobDetailFactoryBean起到工厂类的作用,生成JobDetail对象并制定需要调用的类及类的方法
	<bean id="Order1JobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
	    <property name="targetObject" ref="secondHandReturnOrder1JobServiceImpl" /><!-- 调用的类 -->  
	    <property name="targetMethod" value="Run" /><!-- 调用类中的方法 -->  
	    <property name="concurrent" value="false" />
	</bean>

定义CronRigger,CronTriggerBean其实是继承了CronTrigger

	<bean id="Order1DoTime" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
		<property name="jobDetail" ref="secondHandReturnOrder1JobTask" /> <!-- cron表达式 --> 
		<property name="cronExpression" value="0 30 2 * * ?" />
	</bean>

从SchedulerFactory获取Scheduler对象并调度定义的Trigger

	<bean id="startQuartz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
	    	<property name="triggers"> 
	        	<list> 
	              		<ref bean="secondHandReturnOrder1DoTime"/>
	          	</list> 
	     	</property> 
	 </bean>

做个api来监控和调度Quartz吧

我称之为Quartz API,它是一个servlet,起到API的作用,接受外部请求,展示并控制当前quartz调度的任务

首先获取Spring注入生成的Schedule

	applicationContext=WebApplicationContextUtils.getRequiredWebApplicationContext(this.getServletContext()); 
	scheduler=(Scheduler) applicationContext.getBean("startQuartz");

获取当前调度的Quartz信息
	String [] triggerGNs = scheduler.getTriggerGroupNames();
	for (int i = 0; i < triggerGNs.length; i++) {
		String [] triggerNames = scheduler.getTriggerNames(triggerGNs[i]);
		for (int j = 0; j < triggerNames.length; j++) {
			Trigger trigger = scheduler.getTrigger(triggerNames[i], triggerGNs[i]);
			HashMap<String, String> map = new HashMap<String, String>();	
			if(trigger instanceof CronTrigger)
			{
				map.put("cronExpression", ((CronTrigger)trigger).getCronExpression());
			}
			map.put("jobname", trigger.getJobName());
			map.put("jobgroup", trigger.getJobGroup());
			map.put("last_time", df.format(EConvert.toDate(trigger.getPreviousFireTime())));
			map.put("next_time", df.format(EConvert.toDate(trigger.getNextFireTime())));
			int status = scheduler.getTriggerState(trigger.getName(), trigger.getGroup());
			map.put("status",getTriggerStatusName(status));
			list.add(map);
		}
	}

暂停/恢复Job
pause
	scheduler.pauseJob(jobname, jobgroup);

resume
	scheduler.resumeJob(jobname, jobgroup);

执行一次作业

	scheduler.triggerJob(jobname, jobgroup);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值