Quartz遇到的问题

本文首次发布于My Blog,作者@张琦(Ian),转载请保留原文链接。

有状态和无状态

  使用有状态(StatefulJob)还是无状态的任务(Job)
在 Quartz 中,基本来说,任务分为有状态和无状态两种。实现 Job 接口的任务缺省为无状态的。Quartz 中还有另外一个接口 StatefulJob。实现 StatefulJob 接口的任务为有状态的。

无状态任务:一般指可以并发的任务,即任务之间是独立的,不会互相干扰。有状态反之。

通过Quartz获得状态为启动的所有job

 /*
Create a GroupMatcher that matches job groups starting with the given string.*/
GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();/*
Get the keys of all the JobDetails in the matching groups.*/
Set<JobKey> jobKeys = sched.getJobKeys(matcher);

  通过jobKeys可以获取job的名称,和一系列的东西。不知道怎么获得,可以看quartz定时任务了解下,再根据下面的api文档基本就没问题了。

这两个是放job类上的注解。
@DisallowConcurrentExecution //意思是:禁止并发执行多个相同定义的JobDetail,就是我们想要的。
@PersistJobDataAfterExecution //意思是:放在JobDetail 里的JobDataMap是共享的,也就是相同任务之间执行时可以传输信息

工具类:

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;import javax.annotation.PostConstruct;import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.matchers.GroupMatcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.stereotype.Service;import cn.net.yto.o2iMonitor.quartz.QuartzJobFactory;
import cn.net.yto.o2iMonitor.quartz.QuartzJobFactoryDisallowConcurrentExecution;
import cn.net.yto.o2iMonitor.quartz.ScheduleJob;
import cn.net.yto.o2iMonitor.quartz.mapper.JobConfigMapper;public class JobConfigService {private static final Logger LOGGER = LoggerFactory.getLogger(JobConfigService.class);@Autowiredprivate SchedulerFactoryBean schedulerFactoryBean;@Autowiredprivate JobConfigMapper scheduleJobMapper;/*** 从数据库中取 区别于getAllJob* * @return*/public List<ScheduleJob> getAllTask() {return scheduleJobMapper.getAll();}/*** 添加到数据库中 区别于addJob*/public void addTask(ScheduleJob job) {job.setCreateTime(new Timestamp(System.currentTimeMillis()));scheduleJobMapper.insertSelective(job);}/*** 从数据库中查询job*/public ScheduleJob getTaskById(Long jobId) {return scheduleJobMapper.selectByPrimaryKey(jobId);}/*** 更改任务状态* * @throws SchedulerException*/public void changeStatus(Long jobId, String cmd) throws SchedulerException {ScheduleJob job = getTaskById(jobId);if (job == null) {return;}if ("stop".equals(cmd)) {deleteJob(job);job.setStatus(ScheduleJob.STATUS_NOT_RUNNING);} else if ("start".equals(cmd)) {job.setStatus(ScheduleJob.STATUS_RUNNING);addJob(job);}scheduleJobMapper.updateByPrimaryKeySelective(job);}/*** 更改任务 cron表达式* * @throws SchedulerException*/public void updateCron(Long jobId, String cron) throws SchedulerException {ScheduleJob job = getTaskById(jobId);if (job == null) {return;}job.setCron(cron);if (ScheduleJob.STATUS_RUNNING.equals(job.getStatus())) {updateJobCron(job);}scheduleJobMapper.updateByPrimaryKeySelective(job);}/*** 添加任务* * @param scheduleJob* @throws SchedulerException*/public void addJob(ScheduleJob job) throws SchedulerException {if (job == null || !ScheduleJob.STATUS_RUNNING.equals(job.getStatus())) {return;}Scheduler scheduler = schedulerFactoryBean.getScheduler();LOGGER.debug(scheduler+ ".......................................................................................add");TriggerKey triggerKey = TriggerKey.triggerKey(job.getName(), job.getGroup());CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);// 不存在,创建一个if (null == trigger) {Class clazz = ScheduleJob.CONCURRENT_IS.equals(job.getIsConcurrent()) ? QuartzJobFactory.class: QuartzJobFactoryDisallowConcurrentExecution.class;JobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(job.getName(), job.getGroup()).build();jobDetail.getJobDataMap().put("scheduleJob", job);CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCron());trigger = TriggerBuilder.newTrigger().withIdentity(job.getName(), job.getGroup()).withSchedule(scheduleBuilder).build();scheduler.scheduleJob(jobDetail, trigger);} else {// Trigger已存在,那么更新相应的定时设置CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCron());// 按新的cronExpression表达式重新构建triggertrigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();// 按新的trigger重新设置job执行scheduler.rescheduleJob(triggerKey, trigger);}}@PostConstructpublic void init() throws Exception {Scheduler scheduler = schedulerFactoryBean.getScheduler();// 这里获取任务信息数据List<ScheduleJob> jobList = scheduleJobMapper.getAll();for (ScheduleJob job : jobList) {addJob(job);}}/*** 获取所有计划中的任务列表* * @return* @throws SchedulerException*/public List<ScheduleJob> getAllJob() 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.setName(jobKey.getName());job.setGroup(jobKey.getGroup());job.setDescription("触发器:" + trigger.getKey());Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());job.setStatus(triggerState.name());if (trigger instanceof CronTrigger) {CronTrigger cronTrigger = (CronTrigger) trigger;String cronExpression = cronTrigger.getCronExpression();job.setCron(cronExpression);}jobList.add(job);}}return jobList;}/*** 所有正在运行的job* * @return* @throws SchedulerException*/public List<ScheduleJob> getRunningJob() throws SchedulerException {Scheduler scheduler = schedulerFactoryBean.getScheduler();List<JobExecutionContext> executingJobs = scheduler.getCurrentlyExecutingJobs();List<ScheduleJob> jobList = new ArrayList<ScheduleJob>(executingJobs.size());for (JobExecutionContext executingJob : executingJobs) {ScheduleJob job = new ScheduleJob();JobDetail jobDetail = executingJob.getJobDetail();JobKey jobKey = jobDetail.getKey();Trigger trigger = executingJob.getTrigger();job.setName(jobKey.getName());job.setGroup(jobKey.getGroup());job.setDescription("触发器:" + trigger.getKey());Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());job.setStatus(triggerState.name());if (trigger instanceof CronTrigger) {CronTrigger cronTrigger = (CronTrigger) trigger;String cronExpression = cronTrigger.getCronExpression();job.setCron(cronExpression);}jobList.add(job);}return jobList;}/*** 暂停一个job* * @param scheduleJob* @throws SchedulerException*/public void pauseJob(ScheduleJob scheduleJob) throws SchedulerException {Scheduler scheduler = schedulerFactoryBean.getScheduler();JobKey jobKey = JobKey.jobKey(scheduleJob.getName(), scheduleJob.getGroup());scheduler.pauseJob(jobKey);}/*** 恢复一个job* * @param scheduleJob* @throws SchedulerException*/public void resumeJob(ScheduleJob scheduleJob) throws SchedulerException {Scheduler scheduler = schedulerFactoryBean.getScheduler();JobKey jobKey = JobKey.jobKey(scheduleJob.getName(), scheduleJob.getGroup());scheduler.resumeJob(jobKey);}/*** 删除一个job* * @param scheduleJob* @throws SchedulerException*/public void deleteJob(ScheduleJob scheduleJob) throws SchedulerException {Scheduler scheduler = schedulerFactoryBean.getScheduler();JobKey jobKey = JobKey.jobKey(scheduleJob.getName(), scheduleJob.getGroup());scheduler.deleteJob(jobKey);}/*** 立即执行job* * @param scheduleJob* @throws SchedulerException*/public void runAJobNow(ScheduleJob scheduleJob) throws SchedulerException {Scheduler scheduler = schedulerFactoryBean.getScheduler();JobKey jobKey = JobKey.jobKey(scheduleJob.getName(), scheduleJob.getGroup());scheduler.triggerJob(jobKey);}/*** 更新job时间表达式* * @param scheduleJob* @throws SchedulerException*/public void updateJobCron(ScheduleJob scheduleJob) throws SchedulerException {Scheduler scheduler = schedulerFactoryBean.getScheduler();TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getName(), scheduleJob.getGroup());CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCron());trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();scheduler.rescheduleJob(triggerKey, trigger);}public static void main(String[] args) {CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("xxxxx");}}

Quartz 版本为 Quartz 2.2.3:http://d2zwv9pap9ylyd.cloudfront.net/quartz-2.2.3-distribution.tar.gz

006tKfTcgy1fqj5aochgoj309k09kmwz.jpg

扫描关注:热爱生活的大叔

转载本站文章请注明作者和出处 热爱生活的大叔-uniquezhangqi

转载于:https://www.cnblogs.com/uniquezhangqi/p/9199316.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RIP RETE时间获得PHREAKY

我刚刚完成了我称为PHREAK的新规则算法的一些高级文档&#xff0c;这是混合推理中的一个文字游戏。 它仍然有点粗糙和高水平&#xff0c;但希望仍然很有趣。 它建立在ReteOO之上&#xff0c;非常好阅读。 ReteOO算法 ReteOO是在3、4和5系列发行版中开发的。 它采用RETE算法并应…

Hadoop自学笔记(三)MapReduce简单介绍

1. MapReduce Architecture MapReduce是一套可编程的框架&#xff0c;大部分MapReduce的工作都能够用Pig或者Hive完毕。可是还是要了解MapReduce本身是怎样工作的&#xff0c;由于这才是Hadoop的核心&#xff0c;而且能够为以后优化和自己写做准备。 Job Client, 就是用户 Job …

VirtualDOM与diff(Vue实现)

写在前面 因为对Vue.js很感兴趣&#xff0c;而且平时工作的技术栈也是Vue.js&#xff0c;这几个月花了些时间研究学习了一下Vue.js源码&#xff0c;并做了总结与输出。文章的原地址&#xff1a;https://github.com/answershuto/learnVue。在学习过程中&#xff0c;为Vue加上了…

使用Java的RESTful Web服务

REST代表“代表性状态转移”&#xff0c;由Roy Fielding于2000年在其论文“建筑风格和基于网络的软件体系结构设计”中首次提出。 REST是一种建筑风格。 HTTP是一种协议&#xff0c;其中包含一组REST体系结构约束。 REST基础 REST中的所有内容都被视为资源。 每个资源都由UR…

windows npm安装webpack

Webpack: Webpack 是一个前端资源加载/打包工具。 它将根据模块的依赖关系进行静态分析&#xff0c;然后将这些模块按照指定的规则生成对应的静态资源。 参考下图&#xff1a; 安装Webpack: 1.首先需要安装node.js&#xff08;npm&#xff09; 下载地址&#xff1a;node.js dow…

JavaFX中的塔防

我想长时间使用我的游戏引擎来编写《塔防》游戏&#xff0c;但是由于另一个小组努力创建JavaFX《塔防》游戏&#xff0c;所以我认为我宁愿创建另一款游戏。 从邮件列表中&#xff0c;我了解到不再开发其他游戏。 因此&#xff0c;我决定尝试一下。 塔防是一款非常适合基于图块…

CSS pointer-events属性的使用

楔子 在前端的开发中&#xff0c;我们都是直接与用户接触&#xff0c;应该尽量让用户感到操作畅快愉悦&#xff0c;获得类似native的感觉。其中动画是最常用的方法。 这里的需求是&#xff0c;弹层的设计&#xff0c;这个弹层希望可以像 native 上的弹层一样&#xff0c;点击…

深入理解JavaScript之Event Loop

前言 最近阅读《高性能JavaScript》时&#xff0c;第六章谈到“通过定时器将JavaScript执行代码的控制权先让给浏览器用于更新UI状态&#xff0c;然后再将控制权交回给JavaScript代码&#xff0c;这样就可以使得页面更为流畅”&#xff0c;就联想到了之前理解的事件循环。 这…

使用EasyPoi导出Excel

Excel模板来自自己写死的一个excel模板&#xff0c;相当于是用户查询数据&#xff0c;数据填充到一个模板的Excel里&#xff0c;再导出Excel /*创建模板*/String a request.getSession().getServletContext().getRealPath("/resource/河南能源化工集团安全监控系统联网系统…

Hazelcast入门

7月&#xff0c;我写了一个博客向Java开发人员介绍erlang&#xff0c;重点介绍了这两种语言之间的一些异同。 erlang虚拟机具有许多令人印象深刻的内置功能&#xff0c;其中之一是它们独立于位置并且可以互相通信。 这意味着可以通过编写很少的代码行在VM之间同步数据。 如果您…

android手机最低内存,原神手机端需要哪些配置 手机端最低配置要求介绍

原神是一款由米哈游自主研发的全新开放世界冒险游戏&#xff0c;游戏最近迎来了pc端的首次测试&#xff0c;而且在不久之后就会开启原神手机端的公测版本&#xff0c;那么手机端需要什么配置呢&#xff1f;小编带来了详细的介绍。移动端预下载&#xff1a;9月25日下午16&#x…

AnswerOpenCV一周佳作欣赏(0615-0622)

一、How to make auto-adjustments(brightness and contrast) for image Android Opencv Image Correctionim using OpenCV for Android. I would like to know,how to make image correction(auto adjustments of brightness/contrast) for image(bitmap) in android via Open…

所有其他指标均无用

对于队列&#xff0c;无论是实现为JMS &#xff0c;数据库表&#xff08;即Ruby的Delayed :: Job用于队列的什么&#xff09;&#xff0c;甚至是Amazon的SQS &#xff0c;用于评估队列状态的最常见指标是其长度。 从本质上讲&#xff0c;可以基于在任何给定时间队列中驻留多少消…

类似苹果数据线的android,除了常见的安卓、苹果、Type-c,还有哪些你不知道的手机数据线?...

随着智能手机日益发展&#xff0c;辅助智能手机的数据线配件也越来越多样。现在我们最常见的无非就是标准Micro usb口、正反随便插的Type-c接口、还有苹果Lightning数据线&#xff0c;那么除了这些类型数据线&#xff0c;你知道如今市面上还有哪些更方便好用的手机数据线吗&…

canvas入门实战--邀请卡生成与下载

1.前言 写了很多的javascript和css3的文章&#xff0c;是时候写一篇canvas的了。canvas是html5提供的一个新的功能&#xff01;至于作用&#xff0c;就是一个画布。然后画笔就是javascript。canvas的用途非常的广&#xff0c;特别是html5游戏以及数据可视化这两个方面。现在can…

Apache ActiveMQ 5.9发布

Apache ActiveMQ团队刚刚发布了新的ActiveMQ 5.9版本 。 Apache ActiveMQ 5.9发布 自从先前的5.8版本以来&#xff0c;此版本是8个月的辛苦工作。 在此发行版中&#xff0c;我们将像往常一样对代理进行增强&#xff0c;并使用最新的协议&#xff08;例如AMQP和MQTT&#xff…

android 美颜录像,Android 关于美颜/滤镜 利用PBO从OpenGL录制视频

前言上次我写了一遍文章《Android 关于美颜/滤镜 从OpenGl录制视频的一种方案》&#xff0c;里面利用ImageReader来从获取Surface上获取数据&#xff0c;但是经过熊皮皮的提醒&#xff0c;我发现多PBO的确可以实现跟ImageReader一样的效果&#xff0c;并且版本要求仅为Android4…

Java对象到对象映射器

我在该项目上使用了Dozer一段时间。 但是&#xff0c;最近我遇到了一个非常有趣的错误&#xff0c;它促使我环顾四周&#xff0c;并尝试使用其他“对象到对象”映射器。 这是我找到的工具列表&#xff1a; 推土机&#xff1a;推土机是Java Bean到Java Bean的映射器&#xff…

android媒体播放框架,Android 使用超简单的多媒体播放器JiaoZiVideoPlayer

在之前的项目中用到了视频播放的功能&#xff0c;在网上看了看使用了大家用的比较多的一个开源项目JiaoZiVideo可以迅速的实现视频播放的相关功能。JiaoZiVideo的简单使用集成了JiaoZiVideo后仅需这几行代码就可以实现播放视频JZVideoPlayerStandard jzVideoPlayerStandard (J…

送福利:ROKID 语音开发板免费送,开启你的物联网之旅

都让一让&#xff0c;我说个事情&#xff1a;掘金联合 Rokid 开发者社区给大家发福利啦&#xff01; 掘金联合 Rokid 开发者社区为大家准备了一些福利&#xff0c;只要秀出你的 skill 和技术栈&#xff0c;就有可能获得 Rokid 全栈语音智能开发套件。 ? Rokid开箱试用活动 活…