quartz timing

Requirement: If an order is placed but has not been paid for a long time, it should be given a time for it to be automatically cancelled.

Maven +ssm+springboot

Quartz old brand products, support persistence, it is very convenient and simple to use 

    Advantages: relatively simple

Disadvantages: In the case of high concurrency, there will be a large number of scheduled tasks. cause performance impact.

Add jar package

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-quartz</artifactId>

</dependency>

 

Add configuration class for scheduled tasks

@Configuration

  public class QuartzConfig {

   @Bean

    public JobDetail newJob () {

        return JobBuilder. newJob (PrintTimeJob. class ) //PrintTimeJob our business class

                .withIdentity( "9527" ) // You can give the JobDetail an id

                //There is a Map in each JobDetail, which contains the data associated with this Job, which can be obtained through context in the Job class

                .usingJobData( "msg" , "Hello Quartz" ) // Associating key-value pairs

                .storeDurably() // The JobDetail does not need to be deleted even if there is no Trigger association

                .build();

    }

    @Bean

    public Trigger printTimeJobTrigger () {

        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/1 * * * * ? ");

        return TriggerBuilder.newTrigger()

                .forJob(newJob()) // Associate the above JobDetail

                .withIdentity( "quartzTaskService" ) // Give the Trigger a name

                .withSchedule(cronScheduleBuilder)

                .build();

    }

}

 

business class

/**

 * 定时任务业务处理类,我们继承QuartzJobBean

 * 重写executeInternal方法来实现具体的定时业务逻辑

 */

  public class PrintTimeJob extends QuartzJobBean {

  

  

    @Override

    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {

        //获取JobDetail中关联的数据

        String msg = (String) context.getJobDetail().getJobDataMap().get("msg");

        System.out.println("current time :"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "---" + msg);

  

  

    }

}

 

配置数据源

 

//Quartz配置 - scheduler

  @Configuration

  public class QuartzConfig {

    //主数据源

    @Bean

      @Primary //主数据库,指向pethome

    @ConfigurationProperties(prefix = "spring.datasource")

    DataSource dataSource(){

        return DataSourceBuilder.create().build();

    }

    //quartz创建一个自己数据源

    @Bean

    @QuartzDataSource //quartz数据源

    @ConfigurationProperties(prefix = "spring.quartz.properties.org.quartz.datasource")

    DataSource quartzDataSource(){

        return DataSourceBuilder.create().build();

    }

 

持久化和配置百度

添加工具类

package cn. eson.quartz.job;

  

  import static org.quartz.CronScheduleBuilder.cronSchedule;

  import static org.quartz.JobBuilder.newJob;

  import static org.quartz.TriggerBuilder.newTrigger;

  

  import org.quartz.CronTrigger;

  import org.quartz.JobDataMap;

  import org.quartz.JobDetail;

  import org.quartz.JobKey;

  import org.quartz.Scheduler;

  import org.quartz.Trigger;

  import org.quartz.TriggerKey;

  

  /**

 * Quartz调度管理器

 * 

 */

  public class QuartzUtils {

   private static String JOB_GROUP_NAME = "JOB_GROUP_SYSTEM";

   private static String TRIGGER_GROUP_NAME = "TRIGGER_GROUP_SYSTEM";

  

   /**

    * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名

    * 

    * @param sched

    *            调度器

    * 

    * @param jobName

    *            任务名

    * @param cls

    *            任务

    * @param params

    *            任务参数

    * @param time

    *            时间设置,参考quartz说明文档

    * 

    * @Title: QuartzManager.java

    */

   public static void addJob(Scheduler sched, String jobName, @SuppressWarnings("rawtypes") Class cls, Object params,

         String time) {

      try {

         JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME);// 任务名,任务组,任务执行类

         @SuppressWarnings("unchecked")

  

         JobDataMap jobDataMap = new JobDataMap();

         jobDataMap.put("params", params);

         JobDetail jobDetail = newJob(cls).withIdentity(jobKey).setJobData(jobDataMap).build();

         TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);// 触发器

         System.out.println(time);

         Trigger trigger = newTrigger().withIdentity(triggerKey).withSchedule(cronSchedule(time)).build();// 触发器时间设定

         sched.scheduleJob(jobDetail, trigger);

         if (!sched.isShutdown()) {

            sched.start();// 启动

         }

      } catch (Exception e) {

         throw new RuntimeException(e);

      }

   }

  

   /**

    * @Description: 添加一个定时任务

    * 

    * @param sched

    *            调度器

    * 

    * @param jobName

    *            任务名

    * @param jobGroupName

    *            任务组名

    * @param triggerName

    *            触发器名

    * @param triggerGroupName

    *            触发器组名

    * @param jobClass

    *            任务

    * @param params

    *            任务参数

    * @param time

    *            时间设置,参考quartz说明文档

    * 

    * @Title: QuartzManager.java

    */

   public static void addJob(Scheduler sched, String jobName, String jobGroupName, String triggerName,

         String triggerGroupName, @SuppressWarnings("rawtypes") Class jobClass,  Object params, String time) {

      try {

         JobKey jobKey = new JobKey(jobName, jobGroupName);

         JobDataMap jobDataMap = new JobDataMap();

         jobDataMap.put("params", params);

         @SuppressWarnings("unchecked")

         JobDetail jobDetail = newJob(jobClass).withIdentity(jobKey).setJobData(jobDataMap).build();

         // 触发器

         TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName);

         Trigger trigger = newTrigger().withIdentity(triggerKey).withSchedule(cronSchedule(time)).build();

         sched.scheduleJob(jobDetail, trigger);

      } catch (Exception e) {

         throw new RuntimeException(e);

      }

   }

  

   /**

    * @Description: 修改一个任务的触发时间(使用默认的任务组名触发器名触发器组名)

    * 

    * @param sched

    *            调度器

    * @param jobName

    * @param time

    * 

    * @Title: QuartzManager.java

    */

   @SuppressWarnings("rawtypes")

   public static void modifyJobTime(Scheduler sched, String jobName, String time) {

      try {

         TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);

         CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);

         if (trigger == null) {

            return;

         }

         String oldTime = trigger.getCronExpression();

         if (!oldTime.equalsIgnoreCase(time)) {

            JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME);

            JobDetail jobDetail = sched.getJobDetail(jobKey);

            Class objJobClass = jobDetail.getJobClass();

            Object params = jobDetail.getJobDataMap().get("params");

            removeJob(sched, jobName);

            System.out.println("修改任务:" + jobName);

            addJob(sched, jobName, objJobClass, params,time);

         }

      } catch (Exception e) {

         throw new RuntimeException(e);

      }

   }

  

   /**

    * @Description: 修改一个任务的触发时间

    * 

    * @param sched

    *            调度器 *

    * @param sched

    *            调度器

    * @param triggerName

    * @param triggerGroupName

    * @param time

    * 

    * @Title: QuartzManager.java

    */

   public static void modifyJobTime(Scheduler sched, String triggerName, String triggerGroupName, String time) {

      try {

         TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName);

         CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);

         if (trigger == null) {

            return;

         }

         String oldTime = trigger.getCronExpression();

         if (!oldTime.equalsIgnoreCase(time)) {

            // 修改时间

            trigger.getTriggerBuilder().withSchedule(cronSchedule(time));

            // 重启触发器

            sched.resumeTrigger(triggerKey);

         }

      } catch (Exception e) {

         throw new RuntimeException(e);

      }

   }

  

   /**

    * @Description: 移除一个任务(使用默认的任务组名触发器名触发器组名)

    * 

    * @param sched

    *            调度器

    * @param jobName

    * 

    * @Title: QuartzManager.java

    */

   public static void removeJob(Scheduler sched, String jobName) {

      try {

         TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);

         sched.pauseTrigger(triggerKey);// 停止触发器

         sched.unscheduleJob(triggerKey);// 移除触发器

         JobKey jobKey = new JobKey(jobName, JOB_GROUP_NAME);

         sched.deleteJob(jobKey);// 删除任务

      } catch (Exception e) {

         throw new RuntimeException(e);

      }

   }

  

   /**

    * @Description: 移除一个任务

    * 

    * @param sched

    *            调度器

    * @param jobName

    * @param jobGroupName

    * @param triggerName

    * @param triggerGroupName

    * 

    * @Title: QuartzManager.java

    */

   public static void removeJob(Scheduler sched, String jobName, String jobGroupName, String triggerName,

         String triggerGroupName) {

      try {

         TriggerKey triggerKey = new TriggerKey(triggerName, triggerGroupName);

         sched.pauseTrigger(triggerKey);// 停止触发器

         sched.unscheduleJob(triggerKey);// 移除触发器

         JobKey jobKey = new JobKey(jobName, jobGroupName);

         sched.deleteJob(jobKey);// 删除任务

      } catch (Exception e) {

         throw new RuntimeException(e);

      }

   }

  

   /**

    * @Description:启动所有定时任务

    * 

    * @param sched  调度器

    * 

    * @Title: QuartzManager.java

    */

   public static void startJobs(Scheduler sched) {

      try {

         sched.start();

      } catch (Exception e) {

         throw new RuntimeException(e);

      }

   }

  

   /**

    * @Description:关闭所有定时任务

    * 

    * @param sched

    *            调度器

    * 

    */

   public static void shutdownJobs(Scheduler sched) {

      try {

         if (!sched.isShutdown()) {

            sched.shutdown();

         }

      } catch (Exception e) {

         throw new RuntimeException(e);

      }

   }

}

 

使用工具类实现添加和删除任务

添加定时任务

删除定时任务

给任务传递参数

 

package cn. eson;

  

  import cn.eson.quartz.PrintTimeJob;

  import cn. eson.quartz.util.QuartzUtils;

  import lombok.Data;

  import org.junit.Test;

  import org.quartz.Scheduler;

  import org.springframework.beans.factory.annotation.Autowired;

  import org.springframework.scheduling.quartz.SchedulerFactoryBean;

  

  import java.io.Serializable;

  

  public class QuartzUtilTest extends BaseTest {

  

    @Autowired

    private SchedulerFactoryBean factoryBean;

  

    @Test

    public void test() throws Exception{

        System.out.println(factoryBean);

  

        //1 创建定时任务

        Scheduler sched = factoryBean.getScheduler();

        String jobName = "myJob";

        Class cls = PrintTimeJob.class;

  //        Object params = "zs"; //传字符串 //传对象

        Object params = new User(1L,"zs"); //传字符串 //传对象

        String time = "0/1 * * * * ?";

        QuartzUtils.addJob(sched,jobName,cls,params,time);

        //2 睡眠一下

        Thread.sleep(10000);

        //3 删除定时任务

        QuartzUtils.removeJob(sched,jobName);

  

  

        //让程序不结束

        Thread.sleep(100000000);

  

    }

  

  

}

  

  @Data

  class User implements Serializable

{

    private Long id;

    private String name;

  

    public User(Long id, String name) {

        this.id = id;

        this.name = name;

    }

  

    public User() {

    }

}

 

 

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326832211&siteId=291194637