转自 http://www.iteye.com/topic/399980
首先实现多个JobDeatail并注册,比如:
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.sundoctor.example.service.MyQuartzJobBean1</value>
</property>
<bean id="jobDetail2" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.sundoctor.example.service.MyQuartzJobBean2</value>
</property>
<bean id="jobDetail3" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.sundoctor.example.service.MyQuartzJobBean3</value>
</property>
...
其次将多个JobDeatail放到一个HashMap中
<util:map id = "jobDeatailMap" map-class="java.util.HashMap" key-type="java.lang.String" value-type="org.springframework.scheduling.quartz.JobDetailBean">
<entry key="jobDetail1" ref="jobDetail1"/>
<entry key="jobDetail2" ref="jobDetail2"/>
<entry key="jobDetail3" ref="jobDetail3"/>
</util:map>
然后在SchedulerService 注入jobDeatailMap
最后,修改SchedulerServiceImpl中的schedule方法,增加以jobDeatailMap KEY名字为参数:
调用时,传不同的jobDetailName参数就可以调用不用的JobDetail。
引用
<bean id="jobDetail1" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.sundoctor.example.service.MyQuartzJobBean1</value>
</property>
<bean id="jobDetail2" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.sundoctor.example.service.MyQuartzJobBean2</value>
</property>
<bean id="jobDetail3" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.sundoctor.example.service.MyQuartzJobBean3</value>
</property>
...
其次将多个JobDeatail放到一个HashMap中
引用
<util:map id = "jobDeatailMap" map-class="java.util.HashMap" key-type="java.lang.String" value-type="org.springframework.scheduling.quartz.JobDetailBean">
<entry key="jobDetail1" ref="jobDetail1"/>
<entry key="jobDetail2" ref="jobDetail2"/>
<entry key="jobDetail3" ref="jobDetail3"/>
</util:map>
然后在SchedulerService 注入jobDeatailMap
Java代码
- @Service("schedulerService")
- public class SchedulerServiceImpl implements SchedulerService {
- private Scheduler scheduler;
- private Map<String,JobDetailBean> jobDeatailMap;
- @Autowired
- public void setJobDeatailMap(@Qualifier("jobDeatailMap") Map<String,JobDetailBean> jobDeatailMap) {
- this.jobDeatailMap = jobDeatailMap;
- }
- @Autowired
- public void setScheduler(@Qualifier("quartzScheduler") Scheduler scheduler) {
- this.scheduler = scheduler;
- }
- ...
最后,修改SchedulerServiceImpl中的schedule方法,增加以jobDeatailMap KEY名字为参数:
Java代码
- @Override
- public void schedule(String jobDetailName,String name, CronExpression cronExpression) {
- if (name == null || name.trim().equals("")) {
- name = UUID.randomUUID().toString();
- }
- //这个时候JobDetail根据jobDetailName从jobDeatailMap获取
- JobDetail jobDetail = jobDeatailMap.get(jobDetailName);
- try {
- scheduler.addJob(jobDetail, true);
- CronTrigger cronTrigger = new CronTrigger(name, Scheduler.DEFAULT_GROUP, jobDetail.getName(),
- Scheduler.DEFAULT_GROUP);
- cronTrigger.setCronExpression(cronExpression);
- scheduler.scheduleJob(cronTrigger);
- scheduler.rescheduleJob(name, Scheduler.DEFAULT_GROUP, cronTrigger);
- } catch (SchedulerException e) {
- throw new RuntimeException(e);
- }
- }
- 其它多态方法一样修改,增加jobDetailName参数。
调用时,传不同的jobDetailName参数就可以调用不用的JobDetail。
Java代码
- SchedulerService schedulerService = (SchedulerService)springContext.getBean("schedulerService");
- schedulerService.schedule("jobDetail1","审计任务","0/10 * * ? * * *");
- schedulerService.schedule("jobDetail2","发放任务","0/10 * * ? * * *");
- schedulerService.schedule("jobDetail3","AAA任务","0/10 * * ? * * *");
其实很多时候只需要一个JobDetail就可以了,也可以达到多个JobDetail一样的效果,一个JobDetail的时候可以在Trigger名称上做扩展,可以在调度任务时给Trigger名称加上不同的前缀或后缀,比如Trigger名称增加一个前缀参数,
Java代码
- @Override
- public void schedule(String name, String prefix ,CronExpression cronExpression) {
- if (name == null || name.trim().equals("")) {
- name = UUID.randomUUID().toString();
- }
- try {
- scheduler.addJob(jobDetail, true);
- //给Trigger名秒加上前缀
- name = prefix + name;
- CronTrigger cronTrigger = new CronTrigger(name, Scheduler.DEFAULT_GROUP, jobDetail.getName(),
- Scheduler.DEFAULT_GROUP);
- cronTrigger.setCronExpression(cronExpression);
- scheduler.scheduleJob(cronTrigger);
- scheduler.rescheduleJob(name, Scheduler.DEFAULT_GROUP, cronTrigger);
- } catch (SchedulerException e) {
- throw new RuntimeException(e);
- }
- }
然后在QuartzJobBean中的executeInternal方法取到Trigger名秒,然后根据其前缀或后缀调用不同的业务逻辑
Java代码
- public class MyQuartzJobBean extends QuartzJobBean {
- private SimpleService simpleService;
- public void setSimpleService(SimpleService simpleService) {
- this.simpleService = simpleService;
- }
- @Override
- protected void executeInternal(JobExecutionContext jobexecutioncontext) throws JobExecutionException {
- Trigger trigger = jobexecutioncontext.getTrigger();
- //取得Trigger名称,判断名称前缀或后缀调用不同的业务逻辑
- String triggerName = trigger.getName();
- if(tirggerName ...){
- simpleService.testMethod(triggerName);
- }else if(tirggerName ...){
- simpleService.testMethod2(triggerName);
- }else{
- ...
- }
- }
- }