Spring 提供了兩種方法使用org.quartz.JobDetail:MethodInvokingJobDetailFactoryBean和JobDetailFactoryBean。
1)MethodInvokingJobDetailFactoryBean方法:
在創建Job類時,不需要繼承quartz的Job接口,但是需要在JavaConfig中配置Job的執行方法。
MethodInvokingJobDetailFactoryBean創建Bean:
@Bean
public MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean(){
MethodInvokingJobDetailFactoryBean obj=new MethodInvokingJobDetailFactoryBean();
obj.setTargetBeanName("jobOne");
obj.setTargetMethod("myTask");
return obj;
}
創建Job類:
import org.springframework.stereotype.Service;
@Service("jobOne")
public class MyJobOne {
protected void myTask(){
System.out.println("this is my jobOne task!");
}
}
創建SimpleTrigger:
@Bean
public SimpleTriggerFactoryBean simpleTriggerFactoryBean(){
SimpleTriggerFactoryBean stFactory=new SimpleTriggerFactoryBean();
stFactory.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
stFactory.setStartDelay(30000);
stFactory.setRepeatCount(5);
stFactory.setRepeatInterval(30000);
return stFactory;
}
2)JobDetailFactoryBean方法:
在創建Job類時,需要繼承QuartzJobBean類
JobDetailFactoryBean創建Bean:
@Bean
public JobDetailFactoryBean jobDetailFactoryBean(){
JobDetailFactoryBean factory=new JobDetailFactoryBean();
factory.setJobClass(MyJobTwo.class);
Map<String,Object> map=new HashMap<String,Object>();
map.put("name", "RAM");
map.put(MyJobTwo.COUNT, 1);
factory.setJobDataAsMap(map);
factory.setGroup("myGroup");
factory.setName("myJob");
return factory;
}
創建Job類:
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.PersistJobDataAfterExecution;
import org.springframework.scheduling.quartz.QuartzJobBean;
@PersistJobDataAfterExecution //可以保存參數值,使JobDetail下次執行時使用保存值
@DisallowConcurrentExecution //禁止Job實例build的JobDetail併發執行
public class MyJobTwo extends QuartzJobBean {
public static final String COUNT="count";
private String name;
@Override
protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {
// TODO Auto-generated method stub
JobDataMap dataMap=ctx.getJobDetail().getJobDataMap();
int cnt=dataMap.getInt(COUNT);
JobKey jobKey=ctx.getJobDetail().getKey();
System.out.println(jobKey+":"+name+":"+cnt);
cnt++;
dataMap.put(COUNT, cnt);
}
public void setName(String name){
this.name=name;
}
}
創建CronTrigger:
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.PersistJobDataAfterExecution;
import org.springframework.scheduling.quartz.QuartzJobBean;
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class MyJobTwo extends QuartzJobBean {
public static final String COUNT="count";
private String name;
@Override
protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {
// TODO Auto-generated method stub
JobDataMap dataMap=ctx.getJobDetail().getJobDataMap();
int cnt=dataMap.getInt(COUNT);
JobKey jobKey=ctx.getJobDetail().getKey();
System.out.println(jobKey+":"+name+":"+cnt);
cnt++;
dataMap.put(COUNT, cnt);
}
public void setName(String name){
this.name=name;
}
}
在JobDetail和Trigger配置完成後,配置Scheduler:
@Bean
public SchedulerFactoryBean schedulerFactoryBean(){
SchedulerFactoryBean scheduler=new SchedulerFactoryBean();
//scheduler.setTriggers(simpleTriggerFactoryBean().getObject(),cronTriggerFactoryBean().getObject());
scheduler.setTriggers(cronTriggerFactoryBean().getObject());
return scheduler;
}
在SpringMVC Controller中控制Scheduler的移除方法:
@Autowired
SchedulerFactoryBean schedulerFactory;
@Autowired
CronTriggerFactoryBean cronTrigger;
.......
private void outTriggerGroupNames(Scheduler scheduler) throws SchedulerException{
List<String> groupNames=scheduler.getTriggerGroupNames();
for(String groupName:groupNames){
System.out.println(groupName);
}
}
@RequestMapping(value="/cronStop")
public void cronStop(){
Scheduler scheduler=schedulerFactory.getScheduler();
try{
System.out.println("enter cronStop");
System.out.println("before stop cron");
outTriggerGroupNames(scheduler);
<span style="color:#FF0000;">scheduler.unscheduleJob(cronTrigger.getObject().getKey());</span>
System.out.println("after stop cron");
outTriggerGroupNames(scheduler);
}catch(SchedulerException e){
e.printStackTrace();
}
}
參考資料:
http://www.concretepage.com/spring-4/spring-4-quartz-2-scheduler-integration-annotation-example-using-javaconfig
http://my.oschina.net/xuleo/blog/212749