转载

QuartZ配置开发

spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错。
至于原因,则是spring对于quartz的支持实现org.springframework.scheduling.quartz.CronTriggerBean继承了org.quartz.CronTrigger,在quartz1.x系列中org.quartz.CronTrigger是个类,而在quartz2.x系列中org.quartz.CronTrigger变成了接口,从而造成无法用spring的方式配置quartz的触发器(trigger)。
这里使用的quartz版本是2.2.1 。


pom.xml添加quartz依赖包

<dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.2.1</version>
    </dependency>

项目启动类配置web.xml

    <listener>
        <listener-class>com.szreachflow.app.scheduled.StartSchedulerJobListener</listener-class>
    </listener>

启动类StartSchedulerJobListener.java

public class StartSchedulerJobListener  implements ServletContextListener {
    private static final Log log = LogFactory.getLog(StartSchedulerJobListener.class);

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        // 项目启动的时候执行的方法
        // 这里可以放你要执行的代码或方法
        //简单任务调度,每隔多少时间执行一次,执行n次
        try {
            SchedulerUtil.handleSimpleTrigger("企业微信消息", "企业微信消息组","企业微信消息触发器", "企业微信消息触发器组", PushJob.class, 1, -1);
        } catch (Exception e) {
            log.warn("SchedulerUtil.handleSimpleTrigger执行任务出现异常E:["+ e.getMessage() + "]");
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        // 项目消亡的时候执行的方法
    }
}

定时任务公共类SchedulerUtil.java

public class SchedulerUtil {

    private static final Log log = LogFactory.getLog(SchedulerUtil.class);

    /**
     * [简单任务调度:每次执行间隔为多少毫秒,执行多少次] <br>
     * @param jobName 任务名字
     * @param jobGroupName 任务组名字
     * @param triggerName 触发器名字
     * @param triggerGroupName 触发器组名字
     * @param jobClass 任务类
     * @param interval 时间间隔
     * @param count 执行几次  -1(不限)<br>
     */
    public static void handleSimpleTrigger(String jobName, String jobGroupName,
                                           String triggerName, String triggerGroupName, Class jobClass,
                                           int interval, int count) {
        // 通过schedulerFactory获取一个调度器
        SchedulerFactory schedulerfactory = new StdSchedulerFactory();
        Scheduler scheduler;
        try {
            // 通过schedulerFactory获取一个调度器
            scheduler = schedulerfactory.getScheduler();
            // 创建jobDetail实例,绑定Job实现类
            // 指明job的名称,所在组的名称,以及绑定job类
            JobDetail job = JobBuilder.newJob(jobClass)
                    .withIdentity(jobName, jobGroupName).build();
            // 定义调度触发规则
            //使用simpleTrigger规则
            Trigger trigger=TriggerBuilder.newTrigger().withIdentity(triggerName,
                    triggerGroupName)
                    .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(interval).withRepeatCount(count))
                    .startNow().build();
            // 把作业和触发器注册到任务调度中
            scheduler.scheduleJob(job, trigger);
            // 启动调度
            scheduler.start();
        } catch (Exception e) {
            log.warn("执行"+jobName+"组"+jobName+"任务出现异常E:["+ e.getMessage() + "]");
        }
    }
    /**
     * [复杂任务调度:每天几点几分几秒定时执行任务] <br>
     * @param jobName 任务名字
     * @param jobGroupName 任务组名字
     * @param triggerName 触发器名字
     * @param triggerGroupName 触发器组名字
     * @param jobClass 任务类
     * @param cron 触发规则<br>
     */
    public static void hadleCronTrigger(String jobName, String jobGroupName,
                                        String triggerName, String triggerGroupName, Class jobClass,String cron) {
        // 通过schedulerFactory获取一个调度器
        SchedulerFactory schedulerfactory = new StdSchedulerFactory();
        Scheduler scheduler;
        try {
            // 通过schedulerFactory获取一个调度器
            scheduler = schedulerfactory.getScheduler();
            // 创建jobDetail实例,绑定Job实现类
            // 指明job的名称,所在组的名称,以及绑定job类
            JobDetail job = JobBuilder.newJob(jobClass)
                    .withIdentity(jobName, jobGroupName).build();
            // 定义调度触发规则
            //使用cornTrigger规则  每天18点30分
            Trigger trigger=TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName)
                    .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                    .startNow().build();
            // 把作业和触发器注册到任务调度中
            scheduler.scheduleJob(job, trigger);
            // 启动调度
            scheduler.start();
        } catch (Exception e) {
            log.warn("执行"+jobName+"组"+jobName+"任务出现异常E:["+ e.getMessage() + "]");
        }
    }

    public static void main(String[] args) {
        //简单任务调度,每隔多少时间执行一次,执行n次
        SchedulerUtil.handleSimpleTrigger("任务名字", "任务组名字","触发器名字", "触发器组名字", PushJob.class, 1, -1);
        //复杂调度,每天的什么时候执行任务
        //SchedulerUtil.hadleCronTrigger("任务名字", "任务组名字","触发器名字", "触发器组名字",PushJob.class,"0 19 19 * * ? *");
    }

}

任务业务类PushJob.java

public class PushJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.print("=================PushJob start=================================");

        System.out.print("=================PushJob end=================================");
    }
}
正文到此结束