SpringMVC整合Quartz

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章