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
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 一元三次方程
    Java实现 蓝桥杯VIP 算法训练 乘法表
    Java实现 蓝桥杯VIP 算法训练 矩阵加法
    Java实现 蓝桥杯VIP 算法训练 一元三次方程
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 平方计算
    Java实现 蓝桥杯VIP 算法训练 乘法表
    Java实现 蓝桥杯VIP 算法训练 乘法表
    监管只是压倒网盘业务的一根稻草,但不是主要原因(答案只有一个:成本!)
  • 原文地址:https://www.cnblogs.com/orco/p/6211477.html
Copyright © 2011-2022 走看看