Spring Quartz动态管理定时任务及相关问题总结
2017-04-18 18:24
447 查看
1.application-context.xml配置
2.任务类QuartzJobFactory类编写
3.定时任务管理类
问题:
1,在任务类中无法使用注解得到其他service
解决方法:
新建MyJobFactory类,在application-context.xml中注入(见上面配置文件)
2.利用JobDataMap传参给任务类的时候,如果是同一个请求循环创建了多个task,则保存的是最后map集合,后面通过缓存处理。
<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集合,后面通过缓存处理。
相关文章推荐
- 使用Java并发包线程池和XML实现定时任务动态配置和管理
- Spring 动态管理定时任务(使用quartz) 只是管理启动时间 不能做启动和暂停
- linux定时任务执行没结果,手动执行有结果问题总结
- Spring动态对Quartz定时任务的管理,实现动态加载,停止的配置实例代码
- Quartz动态定时任务管理
- Quartz+Spring Boot实现动态管理定时任务
- [整理]在Spring MVC中使用Quartz实现定时任务动态管理
- Spring动态对Quartz定时任务的管理,实现动态加载,停止的配置实例代码
- spring+quartz实现定时任务遇到问题总结(bean无法注入)
- spring mvc quartz 实现动态定时任务管理
- Spring Quartz 动态配置定时任务
- Linux定时任务没有执行问题分析与总结
- Quartz动态管理一次性定时任务(Spring)
- hadoop2.X动态添加删除节点及相关问题总结
- Spring Boot 定时任务实现后台管理动态配置(动态添加修改删除定时任务)
- Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置
- 【Android Activity相关】任务栈、启动模式相关问题总结
- [置顶] spring整合quartz实现动态定时任务的前台网页配置与管理
- Spring动态对Quartz定时任务的管理,实现动态加载,停止的配置实例代码
- spring quartz 定时任务同时间执行2次的问题