2019独角兽企业重金招聘Python工程师标准>>>

开发VStation过程中,需要实现任务调度,以前用过Quartz,很不错。现在作为插件,集成到Jfinal中。

思路如下:

1、创建QuartzPlugin ,在启动Jfinal是调用。

2、QuartzPlugin中需要调度的Job通过 Job.properties文件定义,支持多个Job定义。通过反射方式,进行调用。

3、每个Job的cron都可设定,且可控制单个Job是否运行

以上实现后,基本可以满足简单的调度工作。

有待优化地方:

1、支持多个scheduler方式

2、支持数据库方式缓存Job内容

------------------------------

代码如下:

/**
Quartz Pojo
@author  作者 左浩(James )E-mail: 25708164@qq.com
@date 创建时间:2016年12月27日 下午6:16:32
@version 1.0
@since
@return  */
package com.vstation.plugins.quartzPlugin;public class Quartz {private String propFile;private String jobsFile;private boolean isEnableRun;public String getPropFile() {return propFile;}public void setPropFile(String propFile) {this.propFile = propFile;}public String getJobsFile() {return jobsFile;}public void setJobsFile(String jobsFile) {this.jobsFile = jobsFile;}public boolean isEnableRun() {return isEnableRun;}public void setEnableRun(boolean isEnableRun) {this.isEnableRun = isEnableRun;}
}/**
Quartz Job Pojo
@author  作者 左浩(James) E-mail: 25708164@qq.com
@date 创建时间:2016年12月27日 下午6:04:33
@version 1.0
@since
@return  */
package com.vstation.plugins.quartzPlugin;public class QuartzJob {private String className;private String cron;private String jobName;private String groupName;private boolean run;public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}public String getCron() {return cron;}public void setCron(String cron) {this.cron = cron;}public String getJobName() {return jobName;}public void setJobName(String jobName) {this.jobName = jobName;}public String getGroupName() {return groupName;}public void setGroupName(String groupName) {this.groupName = groupName;}public boolean isRun() {return run;}public void setRun(boolean run) {this.run = run;}}/**
Quartz Plugins
@author  作者 左浩(James) E-mail: 25708164@qq.com
@date 创建时间:2016年12月27日 下午5:42:46
@version 1.0
@since
@return  */
package com.vstation.plugins.quartzPlugin;import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.apache.log4j.Logger;
import org.quartz.CronTrigger;
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.impl.StdSchedulerFactory;import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.IPlugin;
import com.vstation.controller.UserController;public class QuartzPlugin implements IPlugin {private static Logger log = Logger.getLogger(UserController.class);
//  private String propertiesFile = "quartz.properties";private String jobsFile = "jobs.properties";
//  private boolean isEnableRun = false;private List<String> jobNameList = new ArrayList<String>();                                                   //Job 名称清单private Map<String, QuartzJob> JobsMap = new HashMap<String, QuartzJob>();               //Job 对象Mapprivate SchedulerFactory sf;private Scheduler sched;public QuartzPlugin(Quartz q) {
//      this.propertiesFile = q.getPropFile();this.jobsFile = q.getJobsFile();
//      this.isEnableRun = q.isEnableRun();init();}@SuppressWarnings("unchecked")@Overridepublic boolean start() {// TODO Auto-generated method stublog.info("---------- QuartzPlugin start begin--------------");try {sf = new StdSchedulerFactory();sched = sf.getScheduler();for(int i=0, length = jobNameList.size(); i<length;i++){String jobName = jobNameList.get(i);QuartzJob jobObj = JobsMap.get( jobName);boolean isRun = jobObj.isRun();if(isRun){Class<? extends Job> jobClass1;jobClass1 = (Class<? extends Job>) Class.forName(jobObj.getClassName());JobDetail job = newJob(jobClass1).withIdentity(jobName, jobObj.getGroupName()).build();CronTrigger trigger = newTrigger().withIdentity("trigger1", jobObj.getGroupName()).withSchedule(cronSchedule(jobObj.getCron())).build();sched.scheduleJob(job, trigger);log.info("add "+jobName +" to quartz schedule ");}else{log.info(jobName +" run  is "+ isRun);}}sched.start();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();log.error(e.toString());} catch (SchedulerException e) {// TODO Auto-generated catch blocke.printStackTrace();log.error(e.toString());}log.info("---------- QuartzPlugin start end --------------");return true;}@Overridepublic boolean stop() {log.info("---------- QuartzPlugin stop begin --------------");try {sched.shutdown(true);SchedulerMetaData metaData = sched.getMetaData();log.info("Executed " + metaData.getNumberOfJobsExecuted()+ " jobs.");} catch (SchedulerException e) {// TODO Auto-generated catch blocke.printStackTrace();log.error(e.toString());}log.info("---------- QuartzPlugin stop end --------------");return false;}private boolean init() {log.info("----------init Quartz Jobs begin -------------");boolean result = false;
//      Prop prop = PropKit.use(propertiesFile);Prop jobProp = PropKit.use(jobsFile);Enumeration<Object> e = jobProp.getProperties().keys();while (e.hasMoreElements()) {String key = (String) e.nextElement();if (key.indexOf("job.name")==0) {String jobName = jobProp.get(key);jobNameList.add(jobName);  QuartzJob job = new QuartzJob();job.setClassName(jobProp.get(jobName + ".class"));job.setCron(jobProp.get(jobName + ".cron"));job.setGroupName(jobProp.get(jobName + ".group"));job.setRun(jobProp.getBoolean(jobName+".run"));JobsMap.put(jobName, job);  log.info("job.name."+jobName+" put to map");}else{continue;}}log.info("----------init Quartz Jobs end   -------------");return result;}
}Jfinal Config 中调用代码/**---------Quartz 插件-----------**/Quartz q = new Quartz();q.setJobsFile("jobs.properties");QuartzPlugin quartzPlugin = new  QuartzPlugin(q);me.add(quartzPlugin);quartz.properties 文件org.quartz.scheduler.instanceName=VstationScheduler
org.quartz.scheduler.instanceId=AUTOorg.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 20
org.quartz.threadPool.threadPriority = 9
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore
#org.quartz.jobStore.class=org.quartz.simpl.JDBCJobStore
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = truejobs.properties 文件
####quartz 配置类 ###
#author 左浩(James)
#Email 25708164@qq.com
#Date 2016-12-26
#规则说明:
#1、以job.name 开头,多个job.name 表示有多个任务
#2、以job.name 的value 作为每个任务的后续配置key#--------------信息发送Jobs begin----------------#
job.name.msg=msgSender
msgSender.class=com.vstation.quartz.jobs.msgSendJob
msgSender.run=false
msgSender.group=msgsender
msgSender.cron=* * * * *
#--------------信息发送Jobs end   ----------------##--------------日志收集Jobs begin----------------#
job.name.log=LogWriter
LogWriter.class=com.vstation.jobs.LogJob
LogWriter.run=true
LogWrite.group=logwrite
LogWriter.cron=0/5 * * * * ?
#--------------日志收集Jobs end   ----------------#

代码如下

转载于:https://my.oschina.net/vstation/blog/815805

Jfinal Quartz 插件相关推荐

  1. 在Grails中使用Quartz插件实现定时任务

    Quartz插件可以使Grails应用程序按照指定的时间间隔或cron表达式来执行调度任务.Grails系统通过spring配置使用Quartz Enterprise Job Scheduler 实现 ...

  2. JFinal+Quartz动态任务调度控制台

    [前言]因为项目需要后台动态调度远程服务的任务,其中动态调度选用Quartz调度框架,远程服务还是沿用原来的Hessian,整合到JFinal后台(客户端).本文主要记录JFinal下的Quartz控 ...

  3. quartz定时器依赖_Grails集成Quartz插件实现定时任务(Job)

    build.gradle依赖: //定时器 compile 'org.grails.plugins:quartz:2.0.0.M4' 创建一个job,执行命令: create-job com.test ...

  4. java插件redis,jfinal redis插件报错

    各位大神有知道是为啥的么 Caused by: java.lang.NoClassDefFoundError: org/nustaq/serialization/FSTObjectOutput at ...

  5. jfinal整合quartz实现定时任务的两种方式

    第一种实现方式 1.导入包 <dependency>             <groupId>org.quartz-scheduler</groupId>    ...

  6. Jfinal集成Spring插件

    2019独角兽企业重金招聘Python工程师标准>>> 最近公司使用Jfinal开发项目,不知道什么原因Jfinal和其他的几个插件集成的时候,事物管理并不那么随心,所以就选择了Sp ...

  7. Quartz - 作业调度框架-插件化开发

    背景 大部分业务都是基于定时的任务,特别适合使用quartz这类框架解决定时问题.具体quartz的使用,看官方文档就可以了.下面谈谈对quartz插件化的封装.我们使用quartz.plugin.然 ...

  8. Quartz Scheduler插件–隐藏的宝藏

    尽管在官方文档中进行了简要描述,但我相信Quartz插件了解得还不够多,看看它们有多有用. 本质上,Quartz中的插件是方便的类,用于包装基础侦听器的注册. 您可以自由编写自己的插件,但我们将专注于 ...

  9. 【Quartz】插件的使用

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. Quartz 框架提供了几种用于扩展平台能力的方式.通过使用各种 "钩子" (通 ...

  10. 使用Rythm插件轻松实现JFinal应用的国际化

    2019独角兽企业重金招聘Python工程师标准>>> 刚看了@eyelee同学的JFinal 国际化的简单实现的文章,我打算分享一下自己为@紫电清霜的JFinal-BBS示例应用添 ...

最新文章

  1. 清理C盘无用的垃圾的文件,给c盘瘦身
  2. mysql利用CPU多核
  3. C#中static静态变量的用法
  4. [转]VC无负担实现XP风格界面
  5. 快速构建Windows 8风格应用15-ShareContract构建
  6. [学习笔记]03.字符串的扩展
  7. 系统数据据结库设计理论mysql_基于JavaEE的报刊征订管理系统_JSP网站设计_MySQL数据库设计...
  8. windbg调试堆破坏
  9. CF196E Opening Portals
  10. 我是Leader,我被降职成了普通员工,HR说:公司要梯队年轻化
  11. 05-windows下SQL Developer连接Orcale
  12. c语言随机产生10个30 100,c语言编写随机产生10个100~200之间整数,幷按从大到小排序...
  13. linux进程timer,Linux Timer 示例
  14. C#中 ?? 的用法
  15. XRD测试的68个问题(三)
  16. 稀疏编码的经典解法——ISTA算法的推导
  17. ppt流程图按步骤链接_【PPT教程】在PowerPoint中5分钟制作一个流程图
  18. 查询用户连续登录的天数
  19. LeetCode:青蛙跳石头游戏
  20. 跨境人必收藏!掘金新赛道,带你科学开启TikTok Shop英国市场

热门文章

  1. class 反编译工具 jadclipse
  2. Linux安装和卸载MySQL数据库
  3. 研磨java_研磨设计模式.pdf
  4. linux中用户信息存储在,在linux中,用于存放用户信息的两个文件是/etc/passwd和/etc/shadow。()...
  5. python参考手册下载_python3.8.4官方中文文档 API手册 PDF 高质量版
  6. Ubuntu上CUDNN下载及安装过程详细介绍
  7. SOEM Ethercat在TI DSP RTOS上的移植
  8. psasp和matlab,MATLAB和PSASP电力系统潮流计算比较研究
  9. 联想计算机怎样分区,怎么给联想笔记本硬盘分区【图文】
  10. labview计算机论文,毕业论文:基于Labview的信号发生器设计