zoukankan      html  css  js  c++  java
  • springmvc+quartz 实现定时任务

    springmvc+quartz实现定时任务;

    1.pom.xml中添加依赖

        1)springmvc依赖省略。。

         2)quartz依赖

       

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

     

    2. 代码实现

      1)systemJob实体类

      

      省略 geter and seter

       2.) service 类

     

      3.)任务调度类

       

    package com.meta.wx.quartz;
    
    import com.meta.wx.beans.SystemJob;
    import com.meta.wx.utils.DateUtil;
    import org.quartz.*;
    import org.quartz.impl.StdSchedulerFactory;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.scheduling.quartz.SchedulerFactoryBean;
    import org.springframework.stereotype.Service;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashSet;
    
    /**
     * 定时任务
     * @author Administrator
     * CronTrigger的作业 (Trigger的另一个分支)比较强大
     *  基于日历的作业调度器 (如在每月的1号执行或每周一调用等)
     *  而不像SimpleTrigger那样精确指定间隔时间,比SimpleTrigger更常用。
     *  Cront 表达式来设置调度的频率
     *  秒 分 时 日 月 周 年     顺序设置
     *
     *  Scheduler 的主要函数
     *  Date scheduleJob(JobDetail jobDetail,Trigger trigger) 绑定JobDetail和Trigger 返回最近一次要执行的时间
     *  void start() 启动
     *  void standby()挂起执行(可用start()开启)
     *  void  shutdown()关闭
     */
    @Service
    public class JobTask {
        private Logger log= LoggerFactory.getLogger(JobTask.class);
        @Autowired
        private SchedulerFactoryBean schedulerFactoryBean;
    
    
        /**
         * 启动任务
         * @throws SchedulerException
         */
      public boolean startJob(SystemJob sjob) throws SchedulerException{
          //创建Scheduler实例
          Scheduler scheduler=schedulerFactoryBean.getScheduler();
        //创建一个JobDetail实例,绑定所建的作业
          Class clazz= null;
          try {
              clazz = Class.forName(sjob.getClasspath());
          } catch (ClassNotFoundException e) {
              e.printStackTrace();
          }
    
          JobDetail jobDetail=JobBuilder.newJob(clazz).build();
          // 创建一个Trigger;
          TriggerKey triggerKey=TriggerKey.triggerKey(sjob.getId(),Scheduler.DEFAULT_GROUP);
          CronTrigger trigger =(CronTrigger)TriggerBuilder.newTrigger()
                  .withIdentity(triggerKey)
                  .withSchedule(
                          //1.2018年内每天10点15分出发一次
                          //可通过cront表达式在线生成 http://cron.qqe2.com/
                          CronScheduleBuilder.cronSchedule(sjob.getCron())//参数为cront表达式(秒 分 时 日 月 周 年)
                  )
                  .build();
              scheduler.scheduleJob(jobDetail,trigger);//绑定与触发器
    
          //启动任务
          if(!scheduler.isShutdown()){
              scheduler.start();
              log.info("---任务["+triggerKey.getName()+"] 启动成功。。。");
              return true;
          }else{
              log.info("---任务["+triggerKey.getName()+"] 已启动,无需再次启动。。。");
          }
        return false;
      }
    
        /**
         * 修改任务
         * @param sjob
         * @return
         * @throws SchedulerException
         */
        public boolean updateJob(SystemJob sjob) {
            //创建Scheduler实例
            Scheduler scheduler=schedulerFactoryBean.getScheduler();
            String createTime = DateUtil.getCurDate();
    
            try {
                Class clazz =null;
                try {
                    clazz = Class.forName(sjob.getClasspath());
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
                //创建一个JobDetail实例,绑定所建的作业(将该实例与HelloJobClass绑定)
                JobDetail jobDetail=JobBuilder.newJob(clazz).build();
                // 创建一个Trigger;
                TriggerKey triggerKey=TriggerKey.triggerKey(sjob.getId(),Scheduler.DEFAULT_GROUP);
    
                if (scheduler.checkExists(triggerKey)){
                    return false;
                }
    
                JobKey jobKey=JobKey.jobKey(sjob.getId(),Scheduler.DEFAULT_GROUP);
                CronScheduleBuilder scheduleBuilder=CronScheduleBuilder.cronSchedule(sjob.getCron())
                        .withMisfireHandlingInstructionDoNothing();
                CronTrigger trigger=TriggerBuilder.newTrigger().withIdentity(triggerKey)
                        .withDescription(createTime).withSchedule(scheduleBuilder).build();
    
                    JobDetail jobDetail1=scheduler.getJobDetail(jobKey);
    
                HashSet<Trigger> triggerSet=new HashSet<>();
                triggerSet.add(trigger);
                scheduler.scheduleJob(jobDetail,triggerSet,true);
                log.info("---任务[{}]更新成功---",triggerKey.getName());
                return true;
            } catch (SchedulerException e) {
                e.printStackTrace();
                throw new RuntimeException(e.getMessage());
            }
        }
    
        /**
         * 删除
         * @param job
         * @return
         */
        public boolean remove(SystemJob job){
            Scheduler scheduler=schedulerFactoryBean.getScheduler();
            TriggerKey triggerKey=TriggerKey.triggerKey(job.getId(),Scheduler.DEFAULT_GROUP);
    
            try {
                if (checkJob(job)){
                    scheduler.pauseTrigger(triggerKey);
                    scheduler.unscheduleJob(triggerKey);
                    log.info("---任务[{}]删除成功!",triggerKey.getName());
                    return true;
                }
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
            return  false;
        }
    
        /**
         *     true 存在 false 不存在
         * @param job
         * @return
         */
        public boolean checkJob(SystemJob job){
            Scheduler scheduler=schedulerFactoryBean.getScheduler();
            //触发器
            TriggerKey triggerKey=TriggerKey.triggerKey(job.getId(),Scheduler.DEFAULT_GROUP);
    
            try {
                   if(scheduler.checkExists(triggerKey)){
                       return true;
                   }
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
           return false;
        }
    }

    4.)任务启动线程类
    package com.meta.wx.model;
    
    import com.meta.wx.beans.SystemJob;
    import com.meta.wx.quartz.JobTask;
    import com.meta.wx.service.JobService;
    import com.meta.wx.utils.SpringUtil;
    import org.quartz.Job;
    import org.quartz.SchedulerException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.annotation.Configuration;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    /**
     * Created by Administrator on 2019/3/28.
     * 启动数据库中已经设定为启动状态(status:true)的任务,项目启动时init
     */
    @Configuration
    public class JobTreadModel extends Thread{
        private Logger log= LoggerFactory.getLogger(JobTreadModel.class);
        @Resource
       private JobService jobService;
    
    
        @Override
        public void run() {
    
               try {
                   Thread.sleep(1000);
                   log.info("---启动任务线程----");
                   JobTask jobTask = SpringUtil.getBean("jobTask");
                   List<SystemJob> jobList = jobService.startJob();
                   //开启任务
                   jobList.forEach(jobs -> {
                       log.info("---任务[{}] 系统 init---开始启动 ", jobs.getId());
                       try {
                           jobTask.startJob(jobs);
                       } catch (SchedulerException e) {
                           e.printStackTrace();
                       }
                   });
                   if (jobList.size() == 0) {
                       log.info("---数据库暂无启动的任务---------");
                   } else {
                       log.info("---任务启动完毕---------");
                   }
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
        }
    }
    
    

    5)使用spring的ApplicationListener监听待加载完毕时启动任务

    package com.meta.wx.model;
    
    import org.apache.log4j.Logger;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextRefreshedEvent;
    import org.springframework.stereotype.Component;
    
    /**
     * Created by Administrator on 2019/3/28.
     * 通过监听,开辟线程,执行定时任务 当然 也可以执行其他
     */
    @Component
    public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {
       public Logger log=Logger.getLogger(MyApplicationListener.class);
    
    
        /**
         * bean加载完之后执行
         * @param event
         */
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            System.out.println("-------------bean初始化完毕-------------");
            /**
             * 系统两种容器:root application context 和项目名-servlet context ;
             * 下面代码防止执行两次
             */
            if(event.getApplicationContext().getParent() == null) {
    
                JobTreadModel myThread = (JobTreadModel) event.getApplicationContext().getBean(
                        "jobTreadModel");
                myThread.start();
            }
        }
    }

    6)配置spring的Application_mvc.xml

        <!-- quartz 定时任务配置-->
        <bean id="jobFactory" class="com.meta.wx.quartz.MyJobFactory"></bean>
    
        <bean name="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="jobFactory" ref="jobFactory"></property>
        </bean>



  • 相关阅读:
    CSS3中的opacity透明度属性的继承问题如何解决
    webstorm前端开发工具vue环境配置及运行项目
    new String(getBytes(ISO-8859-1),UTF-8)中文编码避免乱码
    超详细多线程讲解
    jQuery mobile 核心功能
    解读四大移动web应用开发框架真相
    2014,成为更好程序员的7个方法
    window8.1使用之快捷键
    C#深入浅出 关键字(一)
    C#深入浅出 C#语法中的重中之重——委托(四)
  • 原文地址:https://www.cnblogs.com/binkai/p/10618156.html
Copyright © 2011-2022 走看看