`
苦逼老周
  • 浏览: 5812 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring集成quartz持久化简单应用

 
阅读更多


最近在做定时跑批任务的时候用开始接触quartz,写了一个简单的demo,由于经验不足,原理还没有深入理解,有什么不对之处还请各位博友加以指正

首先,quartz在与spring集成是是有版本匹配问题的:quartz-1.x与spring3.1之前的版本对应,而quartz2.x与spring3.1之后的版本对应,quartz1和quartz2是有很大区别的。
如下是quartz1.8.6数据库表结构和quartz2.2.1数据库表结构,根据需求构建数据库,见附件
集成spring与quartz:
一、spring3.1之前版本和quartz1.x集成
1、pom依赖(spring和quartz版本自行匹配)
<properties>
    <spring.version>3.2.9.RELEASE</spring.version>
    <!--<spring.version>3.0.6.RELEASE</spring.version>-->
    <!--<spring.version>3.2.2.RELEASE</spring.version>-->
    <!--<spring.version>4.0.0.RELEASE</spring.version>-->
    <quartz.version>2.2.1</quartz.version>
    <!--<quartz.version>1.8.6</quartz.version>-->
</properties>


<dependencies>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>

    <!-- quartz -->
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>${quartz.version}</version>
    </dependency>

    <!-- mysql begin  -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.30</version>
    </dependency>
    <!-- end of mysql -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.0.16</version>
    </dependency>

</dependencies>
 2、定义job,实现序列化(内存方式不必实现):(quartz1.x版本)
public class HelloJob implements Serializable{

    private static final long serialVersionUID = -2348136105841790133L;

    public void execute(){
        System.out.println("============================");
    }
}
 
3、spring配置:
3.1 数据源配置(内存方式忽略此配置)
jdbc.driverClassName=com.mysql.jdbc.Driver
#quartz1.x数据库
#jdbc.url=jdbc:mysql://127.0.0.1:3306/quartz-test?useUnicode=true
#quartz2.x数据库
jdbc.url=jdbc:mysql://127.0.0.1:3306/quartz2?useUnicode=true
jdbc.username=root
jdbc.password=maidou
jdbc.initialSize=15
jdbc.maxActive=20
jdbc.maxIdle=20
jdbc.minIdle=5
 
<context:property-placeholder location="classpath:properties/*.properties"/>

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
      destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <!--initialSize: 初始化连接 -->
    <property name="initialSize" value="${jdbc.initialSize}" />
    <!--maxActive: 最大连接数量 -->
    <property name="maxActive" value="${jdbc.maxActive}" />
    <!--maxIdle: 最大空闲连接 -->
    <!--<property name="maxIdle" value="${jdbc.maxIdle}" />-->
    <!--minIdle: 最小空闲连接 -->
    <property name="minIdle" value="${jdbc.minIdle}" />
    <property name="defaultAutoCommit" value="true" /><!--这里一定要设置为true,否则在启动项目quartz事务不会自动提交,导致job不能持久化到数据库,抛出异常,正常的程序数据源此项要设置为false,自行控制事务-->

    <property name="validationQuery" value="SELECT 1 " />
</bean>
 3.2 quartz配置(quartz1.x):其中jobDetail bean配置的class 需要自己实现序列化,spring 的MethodInvokingJobDetailFactoryBean没有实现序列化,故需要如下两个java文件,见附件
<!-- 调度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
     <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:properties/quartz.properties" />
    <property name="autoStartup" value="true" />
    <property name="applicationContextSchedulerContextKey" value="applicationContext" />
    <property name="startupDelay" value="20" />
    <property name="overwriteExistingJobs" value="true" />
    <property name="triggers">
        <list>
            <!-- 触发器列表 -->
            <ref bean="helloJobTrigger" />
        </list>
    </property>
</bean>

<bean id="helloJobBean" class="com.maidou.job.HelloJob"/>

<!-- 触发器 -->
<bean id="helloJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="helloJobDetail" />
    <property name="cronExpression" value="0/5 * * * * ?" />
</bean>

<bean id="helloJobDetail"
        class="com.maidou.factory.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="helloJobBean" />
    <property name="targetMethod" value="execute" />
    <property name="concurrent" value="false" />
    <property name="durable" value="true"/>
    <!--<property name="volatility" value="true"/>-->
    <property name="shouldRecover" value="true" />
</bean>

<import resource="spring-db.xml"/>
 4、写quartz.properties覆盖原有quartz.properties;如下
#============================================================================
# Configure Main Scheduler Properties
#============================================================================

org.quartz.scheduler.instanceName = MY_JOB_SCHEDULER
org.quartz.scheduler.instanceId = AUTO

org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false


#============================================================================
# Configure ThreadPool
#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

#============================================================================
# Configure JobStore
#============================================================================

org.quartz.jobStore.misfireThreshold = 60000
#内存方式
#org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
#数据库持久化
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties=false
org.quartz.jobStore.maxMisfiresToHandleAtATime=1
#数据库表名称前缀
org.quartz.jobStore.tablePrefix=QRTZ_
#集群
org.quartz.jobStore.isClustered=false

#============================================================================
# Other Example Delegates
#============================================================================
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.CloudscapeDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.DB2v6Delegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.DB2v7Delegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.DriverDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.HSQLDBDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PointbaseDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.WebLogicDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
#org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.oracle.WebLogicOracleDelegate

#============================================================================
# Configure Datasources
#============================================================================

#org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
#org.quartz.dataSource.myDS.URL = jdbc:mysql://10.1.221.118/invest?useUnicode=true&amp;characterEncoding=utf-8
#org.quartz.dataSource.myDS.user = invest
#org.quartz.dataSource.myDS.password = invest
#org.quartz.dataSource.myDS.maxConnections = 5
#org.quartz.dataSource.myDS.validationQuery=

#============================================================================
# Configure Plugins
#============================================================================

#org.quartz.plugin.shutdownHook.class = org.quartz.plugins.management.ShutdownHookPlugin
#org.quartz.plugin.shutdownHook.cleanShutdown = true


#org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
 
二、spring3.1之后版本和quartz2.x集成
1、pom文件依赖如上pom依赖(自行匹配spring和quartz版本)
2、定义job,继承 QuartzJobBean:(quartz2.x版本)
public class HelloJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("============================");
    }
}
 
3、spring配置:
3.1 数据源配置如上数据源配置
3.2 quartz配置(quartz2.x)配置,可以自定义Listener监听Job和Trigger的执行,分别实现JobListener和TriggerListener接口,如下,见附件
<!--<bean id="myJobListener" class="com.maidou.listener.MyJobListener"/>-->
<!--<bean id="myTriggerListener" class="com.maidou.listener.MyTriggerListener"/>-->

<!-- 调度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
     <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="classpath:properties/quartz.properties" />
    <property name="autoStartup" value="true" />
    <property name="applicationContextSchedulerContextKey" value="applicationContext" />
    <property name="startupDelay" value="20" />
    <property name="overwriteExistingJobs" value="true" />
    <!-- 可以实现自定义的listener,监听JobListener和TriggerListener,同时自定义的也需要分别实现这两个接口-->
    <!--<property name="globalJobListeners" ref="myJobListener"/>-->
    <!--<property name="globalTriggerListeners" ref="myTriggerListener"/>-->

    <property name="triggers">
        <list>
            <!-- 触发器列表 -->
            <ref bean="helloJobTrigger" />
        </list>
    </property>
</bean>

<bean id="helloJobBean" class="com.maidou.job.HelloJob"/>

<!-- 触发器 -->
<bean id="helloJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="helloJobDetail" />
    <property name="cronExpression" value="0/5 * * * * ?" />
    <!--<property name="group" value="group1"/>-->
    <!--<property name="name" value="helloJobTrigger"/>-->
</bean>

<bean id="helloJobDetail"
        class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <property name="jobClass" value="com.maidou.job.HelloJob"/>
    <property name="group" value="group1"/>
    <property name="name" value="helloJobDetail"/>
    <property name="durability" value="true"/>
</bean>

<import resource="spring-db.xml"/>
 
4、写quartz.properties覆盖原有quartz.properties;同上
注意:数据源的配置一定要配置成自动提交,默认quartz用的数据库连接池是c3p0,我用的是alibaba的druid。
 
测试一下
编写测试类:
public class test {
    private static volatile boolean running = true;
    public static void main(String[] args) {
        ClassPathXmlApplicationContext cxt = new ClassPathXmlApplicationContext("classpath:application-context.xml");
        synchronized (test.class) {
            while (running) {
                try {
                    test.class.wait();
                } catch (Throwable e) {
                }
            }
        }
    }
}
 欢迎留言或到我的csdn博客讨论:http://blog.csdn.net/lingyundouer/article/details/50513194
分享到:
评论

相关推荐

    spring-quartz-03

    该demo集成spring和quartz, 可以定时执行任务, 支持corn表达式, 并持久化数据库

    Spring.3.x企业应用开发实战(完整版).part2

    8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础知识 9.1.1 何为数据库事务 ...

    spring +springmvc+mybatis+shiro+主从库+quartz

    最基本的ssm 框架 并集成了shiro 主从库,quartz 持久化到数据库

    Spring3.x企业应用开发实战(完整版) part1

    8.3.2 Spring为不同持久化技术所提供的模板类 8.4 数据源 8.4.1 配置一个数据源 8.4.2 获取JNDI数据源 8.4.3 Spring的数据源实现类 8.5 小结 第9章 Spring的事务管理 9.1 数据库事务基础知识 9.1.1 何为数据库事务 ...

    spring4.1核心包

    包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。 18. spring-webmvc-4.1.1.RELEASE.jar 包含...

    spring-boot示例项目

    quartz|[Spring Scheduler,Quartz,分布式调度,集群,mysql持久化等](https://github.com/smltq/spring-boot-demo/blob/master/quartz/HELP.md) shiro|[授权、认证、加解密、统一异常处理]...

    基于Spring打造简单高效通用的异步任务处理系统

    l Spring封装Job调度:当任务信息都持久化在DB中之后,我们需要将这些信息读取出来执行具体的业务逻辑操作,这里我们通过ScheduledExecutorFactoryBean来实现对任务的循环调度,比如说可采取每隔5min扫描一次待处理...

    SpringBoot+Maven集成demo

    Spring Boot+Maven集成 实现持久化Quartz定时任务管理小demo

    Spring-Reference_zh_CN(Spring中文参考手册)

    处理多个持久化单元 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于原生的JPA实现DAO 12.6.4. 异常转化 12.6.5. 事务管理 12.6.6. JpaDialect III. Web 13. Web框架 13.1. 介绍 13.1.1. 与其他web框架的集成 ...

    spring in action英文版

    第二部分 Spring在业务层的应用  第4章 征服数据库  4.1 学习Spring的DAO理念  4.1.1 理解Spring的DataAccessException  4.1.2 与DataSource一起工作  4.1.3 一致的DAO支持  4.2 在Spring中使用...

    Spring in Action(第2版)中文版

    5.5spring和java持久api 5.5.1使用jpa模板 5.5.2创建一个实体管理器工厂 5.5.3建立使用jpa的dao 5.6spring和ibatis 5.6.1配置ibatis客户模板 5.6.2建立基于ibatis的dao 5.7缓存 5.7.1配置缓存方案 5.7.2...

    Spring in Action(第二版 中文高清版).part2

    5.5 Spring和Java持久API 5.5.1 使用JPA模板 5.5.2 创建一个实体管理器工厂 5.5.3 建立使用JPA的DAO 5.6 Spring和iBATIS 5.6.1 配置iBATIS客户模板 5.6.2 建立基于iBATIS的DAO 5.7 缓存 5.7.1 配置缓存...

    Spring in Action(第二版 中文高清版).part1

    5.5 Spring和Java持久API 5.5.1 使用JPA模板 5.5.2 创建一个实体管理器工厂 5.5.3 建立使用JPA的DAO 5.6 Spring和iBATIS 5.6.1 配置iBATIS客户模板 5.6.2 建立基于iBATIS的DAO 5.7 缓存 5.7.1 配置缓存...

    lenosp-dev-2020.zip

    博客采用vue前后分离,持久层集成tkmapper丰富简单数据交互,支持mysql/sqlserver数据源,实现功能有系统模块:菜单管理、用户管理、角色管理,系统监控:系统日志、接口api、sql监控、可配置化定时任务,工作流程...

    lenosp-master.zip

    博客采用vue前后分离,持久层集成tkmapper丰富简单数据交互,支持mysql/sqlserver数据源,实现功能有系统模块:菜单管理、用户管理、角色管理,系统监控:系统日志、接口api、sql监控、可配置化定时任务,工作流程...

    Java毕业设计-JAVA办公自动化系统(源代码+论文+外文翻译).rar

    4. **Quartz**:一个功能丰富的任务调度库,支持定时任务、集群和持久化。 5. **Redis**:一个高性能的键值存储数据库,用于缓存和Session管理。 该系统具有以下特点: 1. **模块化设计**:系统采用模块化设计,...

    SpringBoot集成MyBatisPlus

    ├── entity-- 数据持久化实体类 │ ├── datasources -- 多数据源工具类 │ ├── shiro -- Shiro验证框架 │ ├── task -- Quartz定时任务 │ ├── util -- 工具类 | ├── FreeMarker -- 自定义...

    SpringBoot_MyBatisPlus:SpringBoot集成MyBatisPlus

    数据持久化实体类│├── datasources -- 多数据源工具类│├── shiro -- Shiro验证框架│├── task -- Quartz定时任务│├── util -- 工具类| ├── FreeMarker -- 自定义FreeMarker标签│├── ...

    lenosp快速开发脚手架-其他

    lenos(p为spring boot版本扩展名)一款快速开发模块化脚手架,采用spring boot 2.0.1+spring+SpringMvc+mybatis+shiro+swagger+ehcache+quartz+freemarker+layui技术开发;实现功能有系统模块:菜单管理、用户管理、...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    1.6. 一个完整的Seam 应用程序:宾馆预订范例............................................................................................................ 45 1.6.1. 介绍......................................

Global site tag (gtag.js) - Google Analytics