Spring整合Quartz开发代码实例

 更新时间:2020年04月24日 14:49:55   作者:海之浪子  
这篇文章主要介绍了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","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 triggerKeyGroup, 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, String triggerKeyGroup) throws SchedulerException {
    // TriggerKey : name + group
  
    TriggerKey triggerKey = TriggerKey.triggerKey(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正常配置信息,然后点击运行即可。

本实例中当运行的任务在暂停的情况下,一旦重新恢复,会将暂停期间的任务运行如图:

源码链接:  https://github.com/albert-liu435/springquartz

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Springboot使用Security实现OAuth2授权验证完整过程

    Springboot使用Security实现OAuth2授权验证完整过程

    安全管理是软件系统必不可少的的功能。根据经典的“墨菲定律”——凡是可能,总会发生。如果系统存在安全隐患,最终必然会出现问题,这篇文章主要介绍了SpringBoot使用Security实现OAuth2授权验证完整过程
    2022-12-12
  • SpringBoot使用Async注解失效原因分析及解决(spring异步回调)

    SpringBoot使用Async注解失效原因分析及解决(spring异步回调)

    这篇文章主要介绍了SpringBoot使用Async注解失效原因分析及解决(spring异步回调),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java线程池 ThreadPoolExecutor 详解

    Java线程池 ThreadPoolExecutor 详解

    这篇文章主要介绍了Java线程池 ThreadPoolExecutor,线程池包括线程集合、阻塞队列、拒绝策略处理器,更多相关内容需要的朋友可以参考一下
    2022-07-07
  • IntelliJ IDEA 设置数据库连接全局共享的步骤

    IntelliJ IDEA 设置数据库连接全局共享的步骤

    在日常的软件开发工作中,我们经常会遇到需要在多个项目之间共享同一个数据库连接的情况,默认情况下,IntelliJ IDEA 中的数据库连接配置是针对每个项目单独存储的,幸运的是,IntelliJ IDEA 提供了一种方法来将数据库连接配置设置为全局共享,从而简化这一过程
    2024-10-10
  • java中关于命令执行汇总

    java中关于命令执行汇总

    这篇文章主要介绍了java中关于命令执行汇总,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 详解java的值传递、地址传递、引用传递

    详解java的值传递、地址传递、引用传递

    这篇文章主要介绍了详解java的值传递、地址传递、引用传递的相关资料,需要的朋友可以参考下
    2017-06-06
  • 关于Java的二叉树、红黑树、B+树详解

    关于Java的二叉树、红黑树、B+树详解

    这篇文章主要介绍了关于Java的二叉树、红黑树、B+树详解,能同时具备数组查找快的优点以及链表插入和删除快的优点的数据结构就是树,需要的朋友可以参考下
    2023-05-05
  • Java中的自动拆装箱、基本类型的转换、包装类的缓存详解

    Java中的自动拆装箱、基本类型的转换、包装类的缓存详解

    文章详细介绍了Java中数据类型的拆装箱、自动拆箱和装箱,以及包装类的缓存机制,包括基本数据类型的容量大小、转换规则和自动类型转换等
    2024-12-12
  • 详细介绍Spring的配置文件

    详细介绍Spring的配置文件

    这篇文章主要为大家详细介绍了Spring中的配置文件的命名以及它的配置文件都有些什么。文中的示例代码讲解详细,感兴趣的小伙伴可以跟上小编一起学习一下
    2022-10-10
  • 深入理解Java中观察者模式与委托的对比

    深入理解Java中观察者模式与委托的对比

    这篇文章主要介绍了Java中观察者模式与委托的对比,观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,委托的实现简单来讲就是用反射来实现的,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05

最新评论