您的位置:首页 > 编程语言 > Java开发

Spring Quartz动态管理定时任务及相关问题总结

2017-04-18 18:24 447 查看
1.application-context.xml配置

<bean id="jobFactory" class="com.kilomob.powernetwork.chinaunicom.quartz.MyJobFactory"></bean>
<bean name="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="jobFactory"></property>
</bean> <!--这是核心的,其他两个是为了解决bean是为了解决在任务类中获取不到注解类的问题添加的-->
<bean id="quartzManager" class="com.kilomob.powernetwork.chinaunicom.quartz.QuartzManager"></bean>


2.任务类QuartzJobFactory类编写

@PersistJobDataAfterExecution
public class QuartzJobFactory implements Job {
private static final Logger LOGGER = LoggerFactory
.getLogger(QuartzJobFactory.class);
@Autowired
RedisService redisService;//注解得到缓存service
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("任务成功运行");

JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
String[] strings = jobDataMap.getKeys();
for (int i = 0; i < strings.length; i++) {

CardRetireSet sCardRetireSet = (CardRetireSet) jobDataMap
.get(strings[i]);
LOGGER.info("定时器测试++++++++++++++++++" + strings[i]
+ "+++++++++++++++++++++" + sCardRetireSet.getId());
}
}
}


3.定时任务管理类

public class QuartzManager {
private static final Logger LOGGER = LoggerFactory
.getLogger(QuartzManager.class);
@Autowired
SchedulerFactoryBean schedulerFactoryBean;
@Autowired
RedisService redisService;
//新增一个定时任务
public void add(CardRetireSet job) throws IOException, SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(job.getId() + "",
job.getId() + "");

// 获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);

// 不存在,创建一个
if (null == trigger) {
JobDetail jobDetail = JobBuilder.newJob(QuartzJobFactory.class)
.withIdentity(job.getId() + "", job.getId() + "").build();
jobDetail.getJobDataMap().put(triggerKey.toString(), job);
LOGGER.info(jobDetail.getJobDataMap().getKeys()[0] + " "
+ job.getId());
/*
* redisService.lpush(triggerKey.toString(), JSONObject.toJSON(job)
* .toString());
*/
// 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(dateConvertToCron(job.getTriggerDate()));

// 按新的cronExpression表达式构建一个新的trigger
trigger = TriggerBuilder.newTrigger()
.withIdentity(job.getId() + "", job.getId() + "")
.withSchedule(scheduleBuilder).build();

scheduler.scheduleJob(jobDetail, trigger);
} else {
// Trigger已存在,那么更新相应的定时设置
// 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(dateConvertToCron(job.getTriggerDate()));

// 按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
.withSchedule(scheduleBuilder).build();

// 按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger);
}
}
//列表
public void list throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();

GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
List<ScheduleJob> jobList = new ArrayList<ScheduleJob>();
for (JobKey jobKey : jobKeys) {
List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
for (Trigger trigger : triggers) {
ScheduleJob job = new ScheduleJob();
job.setJobName(jobKey.getName());
job.setJobGroup(jobKey.getGroup());
job.setDesc("触发器:" + trigger.getKey());
Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
job.setJobStatus(triggerState.name());
if (trigger instanceof CronTrigger) {
CronTrigger cronTrigger = (CronTrigger) trigger;
String cronExpression = cronTrigger.getCronExpression();
job.setCronExpression(cronExpression);
}
jobList.add(job);
}
}
}
//停止
public String stop() throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
scheduler.pauseJob(jobKey);
}
//重启
public String reStart() throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
scheduler.resumeJob(jobKey);
}
//
public String startNow(@PathVariable String jobGroup, @PathVariable String jobName) throws SchedulerException {

Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
scheduler.triggerJob(jobKey);
}
//删除
public String del(@PathVariable String jobGroup, @PathVariable String jobName) throws SchedulerException {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
scheduler.deleteJob(jobKey);
}
}


问题:

1,在任务类中无法使用注解得到其他service

解决方法:

新建MyJobFactory类,在application-context.xml中注入(见上面配置文件)

public class MyJobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;

protected Object createJobInstance(TriggerFiredBundle bundle)
throws Exception {
// 调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
// 进行注入,这属于Spring的技术,不清楚的可以查看Spring的API.
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}


2.利用JobDataMap传参给任务类的时候,如果是同一个请求循环创建了多个task,则保存的是最后map集合,后面通过缓存处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring quartz