zoukankan      html  css  js  c++  java
  • 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包不导入,会报错。

    至此,一个简单的示例已经完成,可以成功运行。

    这个博客主要是javaEE相关或者不相关的记录, hadoop与spark的相关文章我写在下面地址的博客啦~ http://www.cnblogs.com/sorco
  • 相关阅读:
    [Angularjs-学习笔记]工具篇
    2018.03.26 Python-Pandas 字符串常用方法
    每周一本书之《穷爸爸富爸爸》读书笔记
    Java开发中的23种设计模式详解(转)
    javascript常用数组算法总结
    java对redis的基本操作
    MemCache超详细解读
    MySQL数据库优化总结
    SSH三大框架的工作原理及流程
    Java 单例模式详解
  • 原文地址:https://www.cnblogs.com/orco/p/6211477.html
Copyright © 2011-2022 走看看