1. 程式人生 > 程式設計 >Spring整合Quartz開發程式碼例項

Spring整合Quartz開發程式碼例項

我們使用Spring整合Quartz開發,本例項採用資料庫模式的demo。

xml檔案配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
    http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd
      http://www.springframework.org/schema/util
      http://www.springframework.org/schema/util/spring-util.xsd">


  <!--載入資料庫連線的配置檔案-->
  <!--<context:property-placeholder location="jdbc.properties"></context:property-placeholder>-->
  <!-- c3p0:資料來源配置 -->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/quartz?Unicode=true&amp;characterEncoding=UTF-8"/>
    <property name="user" value="root"/>
    <property name="password" value="root"/>
    <property name="initialPoolSize" value="3"/>
    <property name="minPoolSize" value="2"/>
    <property name="maxPoolSize" value="10"/>
    <property name="maxIdleTime" value="60"/>
    <property name="acquireRetryDelay" value="1000"/>
    <property name="acquireRetryAttempts" value="10"/>
    <property name="preferredTestQuery" value="SELECT 1"/>
  </bean>
  
  <bean id="quartzScheduler" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="configLocation" value="quartz.properties"></property>
    <!--  <property name="triggers"></property>-->
  </bean>


</beans>
public class SimpleJob extends QuartzJobBean {
  @Override
  protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
    System.out.println(new Date()+"執行SimpleJob");
  }

}
public class ApplicationContextTest {

  public static Scheduler scheduler;
  
  public static void main(String[] args) throws Exception {


    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationcontext-trigger.xml");
    scheduler = (Scheduler) applicationContext.getBean("quartzScheduler");
    //SimpleJob simpleJob = new SimpleJob();
  
    scheduler.start();
  
    //從資料庫中獲取相應的job及排程資訊
    //JobDetail jobDetail = scheduler.getJobDetail(new JobKey("trigger1","trigger1"));
    //resumeJob(jobDetail.getKey().getName(),jobDetail.getKey().getGroup());
    //新增job執行
    addJob("trigger1","trigger1","job1","job2","0/20 * * * * ?",SimpleJob.class,new HashMap<>());
    Thread.sleep(60 * 1000);
    //重新設定排程時間
    System.out.println("重新設定排程時間");
    rescheduleJob("trigger1","0/10 * * * * ?");
  
    Thread.sleep(60 * 1000);
    //暫停排程
    System.out.println("暫停排程");
    pauseJob("trigger1","trigger1");
  
    Thread.sleep(60 * 1000);
    System.out.println("恢復排程");
    resumeJob("trigger1","trigger1");
  
    Thread.sleep(60 * 1000);
    System.out.println("刪除排程");
    removeJob("trigger1","trigger1");
    Thread.sleep(60 * 1000);
  
    System.out.println(scheduler);
  }
  
  /**
   * 新增job執行
   *
   * @param triggerKeyName
   * @param triggerKeyGroup
   * @param jobName
   * @param jobGroup
   * @param cronExpression
   * @param jobClass
   * @param jobData
   * @return
   * @throws Exception
   */
  public static boolean addJob(String triggerKeyName,String triggerKeyGroup,String jobName,String jobGroup,String cronExpression,Class<? extends Job> jobClass,Map<String,Object> jobData) throws Exception {
  
    JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(triggerKeyName,triggerKeyGroup).build();
  
    Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).withIdentity(triggerKeyName,triggerKeyGroup).build();
    if (jobData != null && jobData.size() > 0) {
      JobDataMap jobDataMap = jobDetail.getJobDataMap();
      jobDataMap.putAll(jobData);  // JobExecutionContext context.getMergedJobDataMap().get("mailGuid");
    }
  
    scheduler.scheduleJob(jobDetail,trigger);

//    if (!scheduler.isShutdown()) {
//      scheduler.start();
//    }

    return true;


  }
  
  /**
   * 重新設定job執行
   * @param triggerKeyName
   * @param triggerKeyGroup
   * @param cronExpression
   * @return
   * @throws SchedulerException
   */
  public static boolean rescheduleJob(String triggerKeyName,String cronExpression) throws SchedulerException {
    TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName,triggerKeyGroup);
  
    if (scheduler.checkExists(triggerKey)) {
      Trigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).withIdentity(triggerKey).build();
      scheduler.rescheduleJob(triggerKey,trigger);
    }
  
    return true;
  }


  /**
   * 刪除job
   * @param triggerKeyName
   * @param triggerKeyGroup
   * @return
   * @throws SchedulerException
   */
  public static boolean removeJob(String triggerKeyName,String triggerKeyGroup) throws SchedulerException {
    // TriggerKey : name + group
  
    TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName,triggerKeyGroup);
  
    boolean result = false;
    if (scheduler.checkExists(triggerKey)) {
      result = scheduler.unscheduleJob(triggerKey);
    }
  
    return result;
  }
  
  /**
   * 暫停job
   * @param triggerKeyName
   * @param triggerKeyGroup
   * @return
   * @throws SchedulerException
   */
  public static boolean pauseJob(String triggerKeyName,triggerKeyGroup);
  
    boolean result = false;
    if (scheduler.checkExists(triggerKey)) {
      scheduler.pauseTrigger(triggerKey);
      result = true;
  
    } else {
  
    }
    return result;
  }
  
  /**
   * 重啟job
   * @param triggerKeyName
   * @param triggerKeyGroup
   * @return
   * @throws SchedulerException
   */
  public static boolean resumeJob(String triggerKeyName,String triggerKeyGroup) throws SchedulerException {
  
    TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName,triggerKeyGroup);
  
    boolean result = false;
    if (scheduler.checkExists(triggerKey)) {
      scheduler.resumeTrigger(triggerKey);
      result = true;
  
    } else {
  
    }
    return result;
  }
}

quart.properties正常配置資訊,然後點選執行即可。

本例項中當執行的任務在暫停的情況下,一旦重新恢復,會將暫停期間的任務執行如圖:

Spring整合Quartz開發程式碼例項

原始碼連結:https://github.com/albert-liu435/springquartz

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。