Quartz Spring动态计划一篇通

看了很多文章,不是花团锦簇,找到重点比较困难,就是缩减版厉害,除了本人外很少有细节

 

在查Quartz Spring动态计划的时候就有这种感觉,我发现有个人写的不错的,详见

http://www.iteye.com/topic/399980

 

不过我更希望简单点

 

 

后来终于他的代码找到了重点,所以写成日志

好了进入正题

 

Spring下的Quartz基本在配置,静态计划和动态计划的差别不大,我将两者放到一块,静态的注释掉,就清楚了

applicationContext-batchJob.xml

	<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<!-- ref bean="doTriggerJob"/ -->
				<ref local="cronTriggerProxy"/>
			</list>
		</property>
		<property name="startupDelay" value="60" />
	</bean>
	
	<!-- bean id="doTriggerJob" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail">
			<ref bean="triggerDailyJob"/>
		</property>
		<property name="cronExpression" value="0 */1 * * * ?"></property>
	</bean -->
	
	<bean id="cronTriggerProxy" class="com.clbb.frm.batch.utils.AdvCronTriggerProxy" init-method="initTriggerInfo">
		<property name="jobService" ref="jobService"></property>
		<property name="jobDetail">
			<ref bean="triggerDailyJob"/>
		</property>
	</bean>
	
	<!-- 定义目标bean和bean中的方法 -->
    <bean id="triggerDailyJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
        	<ref bean="batchKernelAction"/>
        </property>
        <property name="targetMethod">
        	<value>triggerDailyJob</value>
        </property>
    </bean>
	
	<bean id="batchKernelAction" class="com.clbb.frm.batch.BatchKernelAction">
		<property name="batchKernelService" ref="batchKernelService" />
	</bean>

 

 

 

 另外个终点就在AdvCronTriggerProxy.class了,有了这个文件,读取的就是数据库的设置的间隔时间了,而不是通过配置

 

import java.text.ParseException;
import java.util.Set;

import org.quartz.JobDataMap;
import org.springframework.scheduling.quartz.CronTriggerBean;

import com.clbb.model.Job;
import com.clbb.service.JobService;

public class AdvCronTriggerProxy extends CronTriggerBean{

	private static final long serialVersionUID = 2678967427450851648L;

	private JobService jobService;

	/**
	 * @param jobService the jobService to set
	 */
	public void setJobService(JobService jobService) {
		this.jobService = jobService;
	}
	
	public void initTriggerInfo(){
		//数据库中获得需要执行的计划,这里做测试,直接取第一条
		Job job = jobService.getValidJobList().get(0);
		System.out.println("AdvCronTriggerProxy.initTriggerInfo()   "
						  + "\njobId:" + job.getJobId() 
				          + "\nname:" + job.getJobName());
		String cronExpression = job.getCronExp();
		try {
			setCronExpression(cronExpression);

			print();
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
	
	public void print(){
		if(getJobDetail() != null){
			
			System.out.println("==============================================");
			System.out.println("group:        " + getJobDetail().getGroup());
			System.out.println("name:         " + getJobDetail().getName());
			System.out.println("jobClass:     " + getJobDetail().getJobClass());
			System.out.println("datamap:      " + getJobDetail().getJobDataMap());
			System.out.println("key:          " + getJobDetail().getKey());
			System.out.println("listenernames:" + getJobDetail().getJobListenerNames());
			System.out.println("description:  " + getJobDetail().getDescription());
			System.out.println("fullname:     " + getJobDetail().getFullName());
			
			JobDataMap jobDataMap = getJobDetail().getJobDataMap();
			Set<Object> mapKeySet = jobDataMap.keySet();
			System.out.println("==============================================");
			for (Object object : mapKeySet) {
				System.out.println(object + "  :  " + jobDataMap.get(object));
			}
			System.out.println("==============================================");
			String[] listernerNames = getJobDetail().getJobListenerNames();
			for (String names : listernerNames) {
				System.out.println(names);
			}
			System.out.println("==============================================");
			
		}
	}
	
}

 

 

如果你要服务器不重启情况下你要终止服务怎么办呢?

我自己大致封装了个工具类,现在能用起来了

SchedulerUtils.java

 

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdScheduler;
import org.springframework.scheduling.quartz.CronTriggerBean;

import com.clbb.CtxUtil;
import com.clbb.util.Log;

/**
 * @author Charles King
 *
 */
public abstract class SchedulerUtils {
	
	private final static ThreadLocal<Scheduler> schedulerThread = new ThreadLocal<Scheduler>();
	
	public static Scheduler getCurrentScheduler() {
		Scheduler scheduler = (StdScheduler) CtxUtil.getBean("schedulerFactory");
		if(schedulerThread.get()==null){
			schedulerThread.set(scheduler);
		}
		return scheduler;
	}
	
	public static void finish() {
		if(schedulerThread.get()!=null){
			schedulerThread.remove();
		}
	}
	
	public static void deleteJob(String jobName, String groupName){
		Scheduler scheduler = schedulerThread.get();
		try {
			scheduler.deleteJob(jobName, groupName);
		} catch (SchedulerException e) {
			Log.error(scheduler.getClass(), e);
		} finally {
			finish();
		}
	}
	
	public static void reschedule(String triggerName, String groupName, Trigger newTrigger, JobDetail jobDetail){
		Scheduler scheduler = schedulerThread.get();
		try {
			scheduler.addJob(jobDetail, true);
			scheduler.scheduleJob(newTrigger);
			scheduler.rescheduleJob(triggerName, groupName, newTrigger);
		} catch (SchedulerException e) {
			Log.error(scheduler.getClass(), e);
		} finally {
			finish();
		}
	}
	
	public static void reschedule(CronTriggerBean dynamicTrigger, String groupName){
		Scheduler scheduler = schedulerThread.get();
		try {
			scheduler.addJob(dynamicTrigger.getJobDetail(), true);
			scheduler.scheduleJob(dynamicTrigger);
			scheduler.rescheduleJob(dynamicTrigger.getName(), groupName, dynamicTrigger);
		} catch (SchedulerException e) {
			Log.error(scheduler.getClass(), e);
		} finally {
			finish();
		}
	}

}

 

最简单关注deleteJob和reschedule方法就行了,需要用到的时候调用下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值