项目中用到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包不导入,会报错。
至此,一个简单的示例已经完成,可以成功运行。