Quartz Job基本示例
项目中用到job的主要是各种公告,比如活动开始公告这种,以此为例:
public class Domain {
public Domain() {
AnnounceManager.getIns().startAllAnnounceTimer();
}
public static void main(String[] args) {
new Domain();
}
}
#主要处理类AnnounceManager
public class AnnounceManager {
private static AnnounceManager ins = new AnnounceManager();
private AnnounceManager() {
}
public static AnnounceManager getIns() {
return ins;
}
/**
* 向客户端发送公告信息
*/
public void announce(AnnouncementInfo info) {
// 在这里获取到对应公告的实例对象,并进行不同的公告逻辑
System.out.println("AnnounceManager.announce(): " + "开始公告~");
}
public void startAllAnnounceTimer() {
List<Z_announcement_info> list = new ArrayList<>();
try {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
if (!scheduler.isStarted()) {
scheduler.start();
} else {
scheduler.clear();
}
// ************ORCO************
Z_announcement_info a = new Z_announcement_info();
a.setAnnounceId(2);
a.setAnnounceName("活动开始");
a.setCronExpression("0 24 14 * * ?");// 14点24的时候触发,可以随意修改,来进行测试
a.setDefineId(2);
a.setDirection(0);
a.setHasExtraParam(1);
a.setSpeed(5);
a.setStatus(0);
// 定时器表
list.add(a);
// ************ORCO************
// 公告数据存于数据库,quartz.properties中没有配置使用插件
// ORCO中间的代码,目的只要是从数据库中取出公告配置数据,如cron表达式等
// 原本ORCO中间的代码为:list =
// DataManager.getIns.getZ_announcement_infoList();
// 为了清晰,如此修改
AnnouncementInfo info = null;
for (Z_announcement_info z_announcement_info : list) {
// AnnouncementInfo与Z_announcement_info内容基本一致,可以用同一个类
info = new AnnouncementInfo(z_announcement_info);
// 任务名,任务组,任务执行类
JobDetailImpl jobDetail = new JobDetailImpl();
jobDetail.setJobClass(AnnounceJob.class);
jobDetail.setKey(JobKey.jobKey(info.getAnnounceName()));
Map<String, AnnouncementInfo> map = new HashMap<String, AnnouncementInfo>();
// jobDataMapKey可随意修改,在继承JOB的类中从map中通过此key获取map数据
map.put("jobDataMapKey", info);
jobDetail.setJobDataMap(new JobDataMap(map));
// cron 表达式
String cronExpression = info.getCronExpression().trim();
// 触发器
CronTriggerImpl trigger = new CronTriggerImpl();
// 触发器名
trigger.setKey(TriggerKey.triggerKey(info.getAnnounceName()));
try {
// 触发器时间设定
trigger.setCronExpression(cronExpression);
scheduler.scheduleJob(jobDetail, trigger);
} catch (ParseException e) {
}
}
} catch (SchedulerException e) {
} catch (Exception e1) {
}
}
}
#接下来,如果到触发时间,就会走实现JOB接口的类,进行你的逻辑
public class AnnounceJob implements Job {
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
JobDataMap dm = arg0.getMergedJobDataMap();
AnnouncementInfo info = (AnnouncementInfo) dm.get("jobDataMapKey");
try {
AnnounceManager.getIns().announce(info);
} catch (Exception e) {
e.printStackTrace();
}
}
}
#与数据库表相同结构的类
/**
* 公告详细信息
*/
public class Z_announcement_info
{
// 公告id
private int announceId; // 公告名
private String announceName; // 公告类型ID
private int defineId; // 公告的时间周期,使用cron表达式
private String cronExpression; // 公告的走向(0:从右向左,1:从左向右)
private int direction; // 公告的播放速度
private int speed; // 是否拥有额外参数(1 有,0 没有)
private int hasExtraParam; // 是否有效 0:失效,1:有效
private int status; public int getAnnounceId()
{
return announceId;
} public void setAnnounceId(int announceId)
{
this.announceId = announceId;
} public String getAnnounceName()
{
return announceName;
} public void setAnnounceName(String announceName)
{
this.announceName = announceName;
} public int getDefineId()
{
return defineId;
} public void setDefineId(int defineId)
{
this.defineId = defineId;
} public String getCronExpression()
{
return cronExpression;
} public void setCronExpression(String cronExpression)
{
this.cronExpression = cronExpression;
} public int getDirection()
{
return direction;
} public void setDirection(int direction)
{
this.direction = direction;
} public int getSpeed()
{
return speed;
} public void setSpeed(int speed)
{
this.speed = speed;
} public int getHasExtraParam()
{
return hasExtraParam;
} public void setHasExtraParam(int hasExtraParam)
{
this.hasExtraParam = hasExtraParam;
} public int getStatus()
{
return status;
} public void setStatus(int status)
{
this.status = status;
} @Override
public String toString()
{
return "Z_announcement_info [announceId=" + announceId + ", announceName=" + announceName + ", defineId="
+ defineId + ", cronExpression=" + cronExpression + ", direction=" + direction + ", speed=" + speed
+ ", hasExtraParam=" + hasExtraParam + ", status=" + status + "]";
}
}
#最后就是quartz.properties的配置了,这里没有使用插件,此properties能应用大多数情况
# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified. org.quartz.scheduler.instanceName: DefaultQuartzScheduler
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 10
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true org.quartz.jobStore.misfireThreshold: 60000 org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
注:需上传jar包 quartz-2.2.1.jar、quartz-jobs-2.2.1.jar、log4j-1.2.12.jar、slf4j-api-1.6.4.jar、slf4j-log4j12-1.6.4.jar
后三个jar包不导入,会报错。
至此,一个简单的示例已经完成,可以成功运行。
Quartz Job基本示例的更多相关文章
- quartz + spring 配置示例
<!-- 配置job定时任务类 --> <bean id="triggerCalculateLecturerProfitJob" class="com. ...
- Quartz实例:quartz定时任务代码示例
转自:http://www.blogchong.com/post/96.html quartz定时任务调度框架,使用实例. Job类://即实际调度任务实现 . package net.csdn.ed ...
- C#使用Quartz.NET详细讲解
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...
- Quartz.NET作业调度框架详解(转)
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...
- Jobs定时器 - Quartz
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...
- .net Quartz 服务 作业调度
.net项目中使用Quartz (1)在web.config中进行相关配置 <configSections> <section name="quartz" t ...
- Quartz学习——Quartz简单入门Demo(二)
要学习Quartz框架,首先大概了解了Quartz的基本知识后,在通过简单的例子入门,一步一个脚印的走下去. 下面介绍Quartz入门的示例,由于Quartz的存储方式分为RAM和JDBC,分别对这两 ...
- Quartz.NET快速入门指南
最近,在工作中遇到了 Quartz.net 这个组件,为了更好的理解项目代码的来龙去脉,于是决定好好的研究一下这个东西.确实是好东西,既然是好东西,我就拿出来分享一下.万丈高楼平地起,我们也从入门开始 ...
- Quartz教程:快速入门
原文链接 | 译文链接 | 翻译:nkcoder | 校对:方腾飞 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处 ...
随机推荐
- FineUI(专业版)实现百变通知框(无JavaScript代码)!
博客园已经越来越不公正了,居然说我这篇文章没有实质的内容!! 我其实真的想问哪些通篇几十个字,没任何代码和技术分享,嚷嚷着送书的文章的就能雄霸博客园首页几天,我这篇文章偏偏就为管理员所容不下. 其实我 ...
- JavaScript模板引擎artTemplate.js——如何引入模板引擎?
artTeamplate.js在github上的地址:artTemplate性能卓越的js模板引擎 引入模板引擎,就是引入外部javascript啦,并且artTemplate.js不依赖其他第三方库 ...
- GRE与Vxlan网络详解
1. GRE 1.1 概念 GRE全称是Generic Routing Encapsulation,是一种协议封装的格式,具体格式内容见:https://tools.ietf.org/html/rfc ...
- sublime3安装liveload,实现前端自动F5刷新html界面
这两天倒腾编辑器,atom实在太大了,还是sublime好用 以前一直用sublime2, 然后更新到sublime3, 然后把一些必要的插件安装了一下:liveload(自动刷新): package ...
- 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法
3039: 玉蟾宫 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 753 Solved: 444[Submit][Status][Discuss] D ...
- ReactNative 从环境和第一个demo说起,填坑教程
一.React-Native MacOS必备环境配置: 1.安装homebrew(这东西可以理解为命令行的app商店) /usr/bin/ruby -e "$(curl -fsSL http ...
- [Unity] Shader(着色器)输入输出和语义
在Unity5.x后, 已经支持了基于物理的光照模型,也就是常说的次时代引擎所必须具备的功能. 如果在Properties使用2D,CG里要用sampler2D,代表使用的是2维纹理 如果在Prope ...
- C C++ 语法
非常酷的网站: http://yige.org/cpp/defined_data_types.php 在Linux下有一个目录/proc/$(pid),这个目录保存了进程号为pid的进程运行时的所有信 ...
- Holt-Winters原理和初始值的确定
关于模型 (来自以下PPT,从第4页开始) 关于初始值: 以下文档给出了三个模型的初始值计算的思路. 大致思路如下,建立一个p阶移动平均模型,估计出参数即为初始值,具体的根据三种不同的模型,有 ...
- $this-->name
如果要在模板中输出变量,必须在在控制器中把变量传递给模板,系统提供了assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值. $this->assign('name',$va ...