转载

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&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

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

时间:2020-04-24

Spring整合Quartz定时任务并在集群、分布式系统中的应用

概述 虽然单个Quartz实例能给予你很好的Job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成为你应用的一部分了.使用 Quartz 的集群能力可以更好的支持你的业务需求,并且即使是其中一台机器在最糟的时间崩溃了也能确保所有的 Job 得到执行. Quartz 中集群如何工作 一个 Quartz 集群中的每个节点是一个独立的 Quartz 应用,它又管理着其他的节点.意思是你必须对每个节点分别启动或停止

SpringBoot与Quartz集成实现分布式定时任务集群的代码实例

Spring Boot与Quartz集成实现分布式定时任务集群 直接贴代码 POM <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs

详解Quartz 与 Spring框架集成的三种方式

XML+ Spring MVC 版本 POM文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd

Springboot整个Quartz实现动态定时任务的示例代码

简介 Quartz是一款功能强大的任务调度器,可以实现较为复杂的调度功能,如每月一号执行.每天凌晨执行.每周五执行等等,还支持分布式调度.本文使用Springboot+Mybatis+Quartz实现对定时任务的增.删.改.查.启用.停用等功能.并把定时任务持久化到数据库以及支持集群. Quartz的3个基本要素 Scheduler:调度器.所有的调度都是由它控制. Trigger: 触发器.决定什么时候来执行任务. JobDetail & Job: JobDetail定义的是任务数据,而真正的

springboot Quartz动态修改cron表达式的方法

1.概述: 在开发中有的时候需要去手动禁止和启用定时任务,修改定时任务的cron表达式然后再让其动态生效,之前有过SSM的类似的业务的开发但是忘记写下来了...只好重新温习了一次,加上最近比较流行springBoot所以升级了一下用springBoot来完成. 2.关联技术 SpringBoot.Quartz.H2.thymeleaf (好像就这么多) 3.具体流程 1)首先去手动创建一个调度器工厂对象-SchedulerFactoryBean;其实应该不用手动创建的但是为了顾及到业务的复杂性所

spring整合Quartz框架过程详解

这篇文章主要介绍了spring整合Quartz框架过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.Quartz框架简介 Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间.其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性.主要用来执行定时任务,如:定时发送信息.定时生成报表等等. Quartz框架的主要特点: · 强大的调度功能,例如丰富多样的

浅谈SpringBoot集成Quartz动态定时任务

SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Scheduled(cron="0/5 * * * * ?") public void job(){ System.out.println("每五秒执行一次"); } 为什么要使用Quartz 多任务情况下,quartz更容易管理,可以实现动态配置 执行时间表达式: 表达式示例: 集成

Quartz+Spring Boot实现动态管理定时任务

项目实践过程中碰到一个动态管理定时任务的需求:针对每个人员进行信息的定时更新,具体更新时间可随时调整.启动.暂定等. 思路 将每个人员信息的定时配置保存到数据库中,这样实现了任务的动态展示和管理.任务的每一次新增或变更,都会去数据库变更信息. 设置一个统一的任务管理器,专门负责动态任务的增删改查. POM依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mav

通过Spring Boot配置动态数据源访问多个数据库的实现代码

之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中也描述了):只适用于数据库数量不多且固定的情况.针对数据库动态增加的情况无能为力. 下面讲的方案能支持数据库动态增删,数量不限. 数据库环境准备 下面一Mysql为例,先在本地建3个数据库用于测试.需要说明的是本方案不限数据库数量,支持不同的数据库部署在不同的服务器上.如图所示db_project_001.d

Spring Boot下的Job定时任务

编写Job定时执行任务十分有用,能解决很多问题,这次实习的项目里做了一下系统定时更新三方系统订单状态的功能,这里用到了Spring的定时任务使用的非常方便,下面总结一下如何使用: 一,@scheduled注解 @scheduled这个注解是定时任务的核心所在,在某个方法上面标记此注解,即为此方法设置定时调用,当然调用的频率时间还需要在cron中设置. 例如: @Scheduled(cron = "0 */10 * * * ? ") public void handleOrderStat

深入理解Spring Boot的日志管理

前言 Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持, 如:Java Util Logging,Log4J, Log4J2和Logback.每种Logger都可以通过配置使用控制台或者文件输出日志内容. 日志输出格式 2016-08-19 10:22:04.233 INFO 7368 --- [ main] com.juzi.AsyncTest : Started AsyncTest in 10.084 seconds (JVM r

Spring Boot如何动态创建Bean示例代码

前言 本文主要给大家介绍了关于Spring Boot动态创建Bean的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. SpringBoot测试版本:1.3.4.RELEASE 参考代码如下: package com.spring.configuration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.su

Spring Boot Admin Server管理客户端过程详解

要通过Spring Boot Admin Server监视和管理微服务应用程序,应该添加Spring Boot Admin启动器客户端依赖项,并将Admin Server URI指向应用程序属性文件. 注 - 要监视应用程序,应为微服务应用程序启用Spring Boot Actuator端点. 首先,在构建配置文件中添加以下Spring Boot Admin启动程序客户端依赖项和Spring Boot启动程序执行程序依赖项. Maven用户可以在pom.xml 文件中添加以下依赖项 - <dep

Spring Boot实现动态更新任务的方法

前言 SpringBoot 实现动态 Job,可以通过 API 动态变更 cron. 原生的 Job 实现起来很简单,只要用注解 @Scheduled(cron=xxxxxx) 来实现就可以了,但是要实现动态更改 cron ,就需要做点其他的了. 实现方法 在 pom.xml 中添加 quartz-scheduler <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz

详解Spring Boot 中实现定时任务的两种方式

Spring整合Quartz开发代码实例

在 Spring + SpringMVC 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时任务处理器 @Scheduled 注解,另一种就是使用第三方框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具备这两个 Spring 中的定时任务实现策略,当然也支持 Quartz,本文我们就来看下 Spring Boot 中两种定时任务的实现方式. @Scheduled 使用 @Scheduled 非常容易,直接创建一个

Spring Boot定时任务的使用方法

本文介绍在Spring Boot 中如何使用定时任务,使用非常简单,就不做过多说明了. 下面是代码类: package org.springboot.sample.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.anno

Spring Boot Admin 的使用详解

一.前言 Spring Boot Admin 用于监控基于 Spring Boot 的应用.官方文档在这里(v1.3.4):<Spring Boot Admin Reference Guide> 实践的过程中,感觉这个 User Guide 结构上还是说的不太明白.所以我就大概写一遍我的实践过程与理解. 阅读此文前提条件是: 使用过 Maven. 你跑过基于 Spring Boot 的 hello world 程序. 第三节需要你会点 Spring Cloud 的 Eureka Server

原文  https://www.zhangshengrong.com/p/OgN5Dw3xan/
正文到此结束
Loading...