JFinal 整合Quartz

Stella981
• 阅读 1155

       项目中要加入调度和计划任务等功能,所以选择Quartz调度插件,原先都是在S2SH上整合的。现在项目用JFinal框架,不得不说JFinal框架的定制性真好,可以自己根据项目要求进行修改,并且很节省时间。

        原先当然是先找有没有JFinal的quartz插件,先是找到了JFinal-ext,里面有一个QuartzPlugin,不过因为自己比较喜欢在代码中配置调度,而且项目需求中的调度是实时性的,不是定死的。所以不太适用,所以在JFinal-ext的QuartzPlugin基础上,“抄袭”了一下,下面是我自己改的

QuartzPlugin

import java.util.Properties;

import org.quartz.Scheduler;
import org.quartz.impl.StdSchedulerFactory;

import xidian.wwf.ivc.quartz.QuartzFactory;
import xidian.wwf.ivc.utils.PropertiesUtil;

import com.jfinal.plugin.IPlugin;

/**
 * Quartz插件
 * @author WWF
 */
public class QuartzPlugin implements IPlugin{
    
    
    /**默认配置文件**/
    private String config = "quartz.properties";
    
    public QuartzPlugin(){
        
    }
    
    public QuartzPlugin(String config){
        this.config = config;
    }

    @Override
    public boolean start() {
        try {
            //加载配置文件
            Properties props = PropertiesUtil.loadPropertyFile(config);
            //实例化
            QuartzFactory.sf = new StdSchedulerFactory(props);
            //获取Scheduler
            Scheduler sched = QuartzFactory.sf.getScheduler();
                sched.start();
                return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    @Override
    public boolean stop() {
        try {
            QuartzFactory.sf.getScheduler().shutdown();
            QuartzFactory.sf = null;
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

}

QuartzFactory是我自己写的一个开始job任务的管理类,如下

import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;

import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.TriggerKey;

import xidian.wwf.ivc.utils.TimeUtil;

/**
 * QuartzFactory 
 * @author WWF
 */
public class QuartzFactory {
    
    public static SchedulerFactory sf;
    
    /**
     * 定时开始任务
     * @param startTime
     * @param id
     * @param name
     * @param group
     * @param jobClass
     */
    public static void startJobOnce(String startTime, int id,String name,String group,Class<? extends Job> jobClass){
        try {
            Scheduler sched = sf.getScheduler();
            // define the job and tie it to our HelloJob class
              JobDetail job = newJob(jobClass)
                  .withIdentity("job_"+name+"_"+id, "group_"+group+"_"+id)
                  .requestRecovery()
                  .build();
              job.getJobDataMap().put(group+"_"+name, id);
              // 定时执行
              SimpleTrigger trigger = (SimpleTrigger) newTrigger()
                  .withIdentity("trigger_"+name+"_"+id, "group_"+group+"_"+id)
                  .startAt(TimeUtil.StringToDate2(startTime))
                  .build();
              

              sched.scheduleJob(job, trigger);
              sched.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 停止任务
     * @param name
     * @param group
     * @param id
     */
    public static void stopJob(String name,String group,int id){
        try {
            if (sf!=null) {
                Scheduler scheduler = sf.getScheduler();
                TriggerKey triggerKey = TriggerKey.triggerKey("trigger_"+name+"_"+id,"group_"+ group+"_"+id);
                Trigger trigger = scheduler.getTrigger(triggerKey);
                if (trigger!=null) {
                    scheduler.pauseTrigger(triggerKey);
                    scheduler.unscheduleJob(triggerKey);
                    scheduler.deleteJob(trigger.getJobKey());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



}

因为有时候服务器维护,会关闭tomcat,所以我把调度任务存入到数据库中,可以中断回复,下面是我的quartz.properties配置文件和数据库连接ConnectionProvider

quartz.properties

#==================================================
# 配置实例名和id  
#==================================================
org.quartz.scheduler.instanceName = myScheduler
org.quartz.scheduler.instanceId: my
org.quartz.scheduler.skipUpdateCheck: true

#==================================================
# 配置线程池  
#==================================================
org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount: 5
org.quartz.threadPool.threadPriority: 5

#==================================================
# 配置JobStore 
#==================================================
org.quartz.jobStore.misfireThreshold: 600000

org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties=false
org.quartz.jobStore.dataSource=my
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.isClustered=true

#==================================================
# 配置数据库
#==================================================
org.quartz.dataSource.my.connectionProvider.class = QuartzConnectionProvider

QuartzConnectionProvider

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import org.quartz.utils.ConnectionProvider;

import xidian.wwf.ivc.utils.PropertiesUtil;

import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.wall.WallFilter;
import com.jfinal.plugin.druid.DruidPlugin;

/**
 * 自定义QuartzConnectionProvider
 * @author WWF
 */
public class QuartzConnectionProvider implements ConnectionProvider{
    
    private static final String DB_CONFIG="databaseConfig.properties";
    private DruidPlugin druidPlugin;

    @Override
    public Connection getConnection() throws SQLException {
        return druidPlugin.getDataSource().getConnection();
    }

    @Override
    public void initialize() throws SQLException {
        Properties properties = PropertiesUtil.loadPropertyFile(DB_CONFIG);
        druidPlugin = new DruidPlugin(
                properties.getProperty("jdbcUrl"),
                properties.getProperty("user"),
                properties.getProperty("password"),
                properties.getProperty("jdbcDriverClass"));
        // StatFilter提供JDBC层的统计信息
        druidPlugin.addFilter(new StatFilter());
        // WallFilter的功能是防御SQL注入攻击
        WallFilter wallFilter = new WallFilter();
        wallFilter.setDbType("mysql");
        druidPlugin.addFilter(wallFilter);
        druidPlugin.start();
    }

    @Override
    public void shutdown() throws SQLException {
        druidPlugin.stop();
    }

}

QuartzConnectionProvider中使用了DruidPlugin,动态加载数据库配置文件,数据库更换只需要修改数据库配置文件即可

最后,新建一个TestJob

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import xidian.wwf.ivc.utils.TimeUtil;

public class TestJob implements Job{
    
    public TestJob(){
    }

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        System.out.println("开始时间="+TimeUtil.getTimeAll());
        try {
            //JobDataMap dataMap= arg0.getJobDetail().getJobDataMap();
            System.out.println("哇哈哈");
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("结束时间="+TimeUtil.getTimeAll());
    }
    

}

在afterJFinalStart中新建测试任务

//测试quartz
String startTime = "2014-03-09 09:54:00";
QuartzFactory.startJobOnce(startTime, 5, "test", "testgroup", TestJob.class);

到点了就执行TestJob了。大家还可以根据需要,在QuartzFactory中添加间隔定时调度等,因为我项目就一个定点调度,所以基本都是执行一次即可。

写的不好,大家勿喷!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Nginx + lua +[memcached,redis]
精品案例1、Nginxluamemcached,redis实现网站灰度发布2、分库分表/基于Leaf组件实现的全球唯一ID(非UUID)3、Redis独立数据监控,实现订单超时操作/MQ死信操作SelectPollEpollReactor模型4、分布式任务调试Quartz应用
Easter79 Easter79
3年前
SpringBoot2.0高级案例(06):整合 QuartJob ,实现定时器实时管理
一、QuartJob简介1、一句话描述Quartz是一个完全由java编写的开源作业调度框架,形式简易,功能强大。2、核心API(1)、Scheduler代表一个Quartz的独立运行容器,Scheduler将Trigger绑定到特定JobDetail,这样当Tri
Easter79 Easter79
3年前
Spring的业务层和Web层
任务调度  quartz框架  quartz框架实现了Spring的任务调度,用户可以随意的定义触发器调度时间表,并将触发器和任务进行映射。quartz通过调度器、触发器和任务实现任务调度。  Job:主要用来设计任务实现的逻辑,并且只有一个方法execute。  JobDetail:主要用来通过newInst
Stella981 Stella981
3年前
Jfinal集成Spring插件
最近公司使用Jfinal开发项目,不知道什么原因Jfinal和其他的几个插件集成的时候,事物管理并不那么随心,所以就选择了Spring作为Jfinal的插件来管理事物.废话不多说,直接上代码.publicclassMyConfigextendsJFinalConfig{@Overridepublicvo
Wesley13 Wesley13
3年前
JBolt
 JBolt是一个JFinal极速开发框架定制版IDE插件目前仅有Eclipse插件版,Idea插件版正在开发中。更新日志:http://www.jfinal.com/share/977(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.jfinal.com%
Stella981 Stella981
3年前
JFinal Quartz 支持配置文件和持久化
    随着需求的增加,现在要定时启动一个调度和计划任务,原先写的QuartzPlugin,是持久化保存到数据库中的,从数据库中读取任务并执行。要是添加一个每天循环任务,就要在代码里写一次开始任务的代码,执行后,再注释掉,最后重启项目。否则会因为启动同name,同group的任务而报错org.quartz.ObjectAlreadyExistsE
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这