Heim  >  Artikel  >  Java  >  Spring integriert Quartz, um dynamischen Timer-Beispielcode zu implementieren

Spring integriert Quartz, um dynamischen Timer-Beispielcode zu implementieren

高洛峰
高洛峰Original
2017-02-07 15:12:581533Durchsuche

1. Versionsbeschreibung

Versionen unter Spring 3.1 müssen die Quartz1.x-Serie verwenden. Nur Versionen über 3.1 unterstützen Quartz 2.x, sonst tritt ein Fehler auf.

Grund: Spring unterstützt die Quartz-Implementierung .quartz.CronTrigger in der Version 1.8.6

2. JAR-Paket hinzufügen

Meins ist ein Maven-Projekt und die pom.xml-bezogene Konfiguration lautet wie folgt:

<properties>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   <spring.version>3.0.7.RELEASE</spring.version>
   <quartz.version>1.8.6</quartz.version>
 </properties>
3. Integrationsimplementierung
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>${spring.version}</version>
  <exclusions>
    <!-- Exclude Commons Logging in favor of SLF4j -->
    <exclusion>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
    </exclusion>
  </exclusions>
</dependency>
 
<dependency><!--3.0.7没这个包 -->
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
  <version>${spring.version}</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>${spring.version}</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-orm</artifactId>
  <version>${spring.version}</version>
  <type>jar</type>
  <scope>compile</scope>
</dependency>
 
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-test</artifactId>
  <version>${spring.version}</version>
  <type>jar</type>
  <scope>test</scope>
</dependency>

1. Spring-Konfiguration

Spring muss nur Quarzplanungs-Factory-Bean hinzufügen

2. Implementierung der Timer-Arbeitsklasse
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" />

Definition der Timer-Jobklasse, die von der Jobklasse erbt

definiert die Timer-Verwaltungsklasse
package com.ld.nhmz.quartz;
 
import java.text.SimpleDateFormat;
import java.util.Date;
 
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
 
/**
 * quartz示例定时器类
 * 
 * @author Administrator
 * 
 */
public class QuartzJobExample implements Job {
  @Override
  public void execute(JobExecutionContext arg0) throws JobExecutionException {
    System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "★★★★★★★★★★★");
  }
}

Testcode, hier verwendet SchedulerFactory nicht die in konfigurierten Beans Frühling, aber neu Kommen Sie heraus und verwenden Sie
package com.ld.nhmz.quartz;
 
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
 
/**
 * Quartz调度管理器
 * 
 * @author Administrator
 * 
 */
public class QuartzManager {
  private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";
  private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";
 
  /**
   * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
   * 
   * @param sched
   *      调度器
   * 
   * @param jobName
   *      任务名
   * @param cls
   *      任务
   * @param time
   *      时间设置,参考quartz说明文档
   * 
   * @Title: QuartzManager.java
   */
  public static void addJob(Scheduler sched, String jobName, @SuppressWarnings("rawtypes") Class cls, String time) {
    try {
      JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务执行类
      // 触发器
      CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组
      trigger.setCronExpression(time);// 触发器时间设定
      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 time
   *      时间设置,参考quartz说明文档
   * 
   * @Title: QuartzManager.java
   */
  public static void addJob(Scheduler sched, String jobName, String jobGroupName, String triggerName, String triggerGroupName, @SuppressWarnings("rawtypes") Class jobClass, String time) {
    try {
      JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务执行类
      // 触发器
      CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组
      trigger.setCronExpression(time);// 触发器时间设定
      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 {
      CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName, TRIGGER_GROUP_NAME);
      if (trigger == null) {
        return;
      }
      String oldTime = trigger.getCronExpression();
      if (!oldTime.equalsIgnoreCase(time)) {
        JobDetail jobDetail = sched.getJobDetail(jobName, JOB_GROUP_NAME);
        Class objJobClass = jobDetail.getJobClass();
        removeJob(sched, jobName);
        addJob(sched, jobName, objJobClass, 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 {
      CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName, triggerGroupName);
      if (trigger == null) {
        return;
      }
      String oldTime = trigger.getCronExpression();
      if (!oldTime.equalsIgnoreCase(time)) {
        CronTrigger ct = (CronTrigger) trigger;
        // 修改时间
        ct.setCronExpression(time);
        // 重启触发器
        sched.resumeTrigger(triggerName, triggerGroupName);
      }
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
 
  /**
   * @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
   * 
   * @param sched
   *      调度器
   * @param jobName
   * 
   * @Title: QuartzManager.java
   */
  public static void removeJob(Scheduler sched, String jobName) {
    try {
      sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器
      sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器
      sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务
    } 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 {
      sched.pauseTrigger(triggerName, triggerGroupName);// 停止触发器
      sched.unscheduleJob(triggerName, triggerGroupName);// 移除触发器
      sched.deleteJob(jobName, jobGroupName);// 删除任务
    } 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
   *      调度器
   * 
   * 
   * @Title: QuartzManager.java
   */
  public static void shutdownJobs(Scheduler sched) {
    try {
      if (!sched.isShutdown()) {
        sched.shutdown();
      }
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
}

zum Testen, um das Ergebnis anzuzeigen:
package com.ld.nhmz.quartz.test;
 
import org.junit.Test;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
 
import com.ld.nhmz.quartz.QuartzJobExample;
import com.ld.nhmz.quartz.QuartzManager;
 
/**
 * @Description: 测试类
 * 
 * @ClassName: QuartzTest.java
 */
public class QuartzTest {
  @Test
  public void quartz() {
    try {
      SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
      Scheduler sche = gSchedulerFactory.getScheduler();
      String job_name = "动态任务调度";
      System.out.println("【系统启动】开始(每1秒输出一次)...");
      QuartzManager.addJob(sche, job_name, QuartzJobExample.class, "0/1 * * * * ?");
 
      Thread.sleep(3000);
      System.out.println("【修改时间】开始(每2秒输出一次)...");
      QuartzManager.modifyJobTime(sche, job_name, "10/2 * * * * ?");
      Thread.sleep(4000);
      System.out.println("【移除定时】开始...");
      QuartzManager.removeJob(sche, job_name);
      System.out.println("【移除定时】成功");
 
      System.out.println("【再次添加定时任务】开始(每10秒输出一次)...");
      QuartzManager.addJob(sche, job_name, QuartzJobExample.class, "*/10 * * * * ?");
      Thread.sleep(30000);
      System.out.println("【移除定时】开始...");
      QuartzManager.removeJob(sche, job_name);
      System.out.println("【移除定时】成功");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

Spring integriert Quartz, um dynamischen Timer-Beispielcode zu implementierenDie Timer-Verwaltung ist im Spring Control Layer-Code implementiert


Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Lernen aller hilfreich ist. Ich hoffe auch, dass jeder die chinesische PHP-Website unterstützt.

Weitere verwandte Artikel über die Integration von Quartz durch Spring zur Implementierung eines dynamischen Timer-Beispielcodes finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn