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包不导入,会报错。

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

posted @ 2016-12-22 15:28  Orc_Warrior  阅读(346)  评论(0编辑  收藏  举报