看了很多文章,不是花团锦簇,找到重点比较困难,就是缩减版厉害,除了本人外很少有细节
在查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方法就行了,需要用到的时候调用下