`
苦逼老周
  • 浏览: 5898 次
  • 性别: 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
分享到:
评论

相关推荐

    springboot2.3集成quartz定时任务持久化数据库,支持集群

    在本文中,我们将深入探讨如何在Spring Boot 2.3版本中集成Quartz定时任务,并实现其持久化到数据库,以便支持集群环境。这个过程的关键在于配置Quartz Scheduler,设置数据库连接,以及确保任务在多节点环境中能够...

    spring集成quartz集群配置

    3. **任务持久化**:Quartz将任务和触发器存储在数据库中,即使应用重启,也能保持任务状态。 4. **异常处理**:在Job类中捕获和处理异常,确保任务的健壮性。 通过上述步骤,你已经掌握了Spring集成Quartz集群配置...

    Quartz持久化资料大全

    综上,Quartz持久化是保证定时任务不因系统重启而丢失的关键技术,它与Spring的集成使得配置更为灵活,而Quartz版本间的兼容性则保证了项目的平滑升级。在实际开发中,理解并掌握这些知识点对于充分利用Quartz的功能...

    quartz界面化持久化管理

    2. **Quartz持久化**: - Quartz支持多种持久化机制,如JDBC JobStore、RAMJobStore等。JDBC JobStore将任务和触发器信息保存在数据库中,确保系统重启后任务不会丢失。 3. **自定义Job类**: - 开发者需要继承`...

    Spring集成Quartz的代码示例

    以上就是Spring集成Quartz的基本步骤。通过这种方式,你可以利用Spring的IoC和AOP特性,结合Quartz的调度能力,实现高度可配置的定时任务。在实际项目中,你可能还需要处理任务的并发控制、异常处理、任务的持久化等...

    quartz和spring-quartz

    4. **JobStore**: Spring-Quartz支持不同的Job存储方式,如RAMJobStore(内存存储)、JDBCJobStore(数据库存储),这决定了Job和Trigger的状态如何持久化。 5. **异常处理**: Spring-Quartz可以通过Spring的异常...

    spring+quartz使用jar包

    Spring 集成 Quartz 的目的是为了利用Quartz的调度能力,使应用可以按需执行定时任务。以下是一些关键的知识点: 1. **Spring与Quartz的整合**:Spring 提供了对Quartz的集成支持,通过`org.springframework....

    spring的quartz定时任务相关(持久化任务)

    本文介绍了如何在Spring框架中集成Quartz定时任务,并重点讨论了任务状态的持久化管理。通过将Quartz与Spring结合使用,不仅能够实现对任务的精确调度,还可以有效地管理和监控任务的执行情况,这对于构建稳定可靠的...

    Java_Spring与Quartz的整合

    - 使用Spring注解:可选地,可以使用Spring的`@DisallowConcurrentExecution`和`@PersistJobDataAfterExecution`注解来控制Job的行为,以及数据的持久化。 2. **创建Job类** - Job类需要实现`org.quartz.Job`接口...

    Spring+quartz相关jar包.rar

    2. 配置 Scheduler:在 Spring 配置文件中,设置 Quartz 的 SchedulerFactoryBean,指定数据库存储(如果需要持久化任务信息)和相关的配置属性。 3. 定义 Job 和 Trigger:创建 Quartz 作业类(Job),实现 org....

    Spring整合Quartz后的简单定时任务示例

    Spring通过`@DisallowConcurrentExecution`和`@PersistJobDataAfterExecution`注解可以帮助我们控制Job的行为,例如防止并发执行和在执行前后持久化数据。 在代码示例中,SpringQuartzDemo可能包含了以下部分: 1. ...

    SpringQuartz的使用文档

    Quartz是开源的,具有高度灵活的调度功能,能够根据预定义的时间表触发任务,同时具备调度状态的持久化能力,即使在系统故障后也能恢复调度。 Spring对Quartz进行了集成,使其更易于在Spring应用程序中使用。Spring...

    Spring+Quartz example

    同时,Quartz还支持任务的持久化,即使应用重启,未完成的任务也能继续执行。 在实际开发中,Spring+Quartz的组合常常用于实现后台的定时任务,比如数据同步、报表生成、邮件发送等。通过这种方式,开发者可以把...

    spring整合quartz文档

    2. **持久化**:Quartz 提供了调度状态的持久化功能,确保即使系统崩溃,任务调度信息也不会丢失。 3. **组件化**:它包含一系列的侦听器、插件和线程池,允许扩展和定制以满足特定需求。 4. **Job 和 Trigger**:...

    Quartz2.0持久化到数据库

    在“Quartz2.0持久化到数据库”这个主题中,我们将深入探讨如何将Quartz2.0的任务调度信息存储到数据库中,以便在系统重启或故障后能够恢复任务,并提供更可靠的调度服务。 首先,理解Quartz2.0的持久化机制至关...

    spring-quartz定时设置详细说明

    Quartz 可以与任何持久化机制集成,包括 JDBC 数据库存储任务信息。 二、Spring 集成 Quartz 1. 添加依赖:在 Maven 或 Gradle 项目中,需要引入 Spring 对 Quartz 的支持。添加相应的依赖库,例如: Maven: ``...

    spring集成quartz

    Spring集成Quartz是一款高效、灵活的任务调度框架,用于在Java应用程序中执行定时任务。Quartz是开源项目,提供了丰富的API和强大的调度功能,而Spring框架则以其强大的依赖注入(DI)和面向切面编程(AOP)能力闻名...

    Spring+Quartz 集群

    本篇文章将深入探讨如何在Spring环境中集成Quartz以构建一个高可用的集群。 首先,我们需要理解Spring和Quartz的核心功能。Spring作为一个全面的Java应用开发框架,提供了依赖注入(DI)、面向切面编程(AOP)以及...

    spring boot集成quartz定时器

    Spring Boot 提供了`@DisallowConcurrentExecution`和`@PersistJobDataAfterExecution`注解来控制Job的并发执行和数据持久化。例如: ```java import org.quartz.Trigger; import org.quartz.TriggerBuilder; import...

    Quartz2.2.1存储与持久化-基于Spring的配置

    在这个基于Spring的配置中,我们将深入探讨如何在Spring应用中集成Quartz,实现任务的存储和持久化。 首先,我们需要在Spring配置文件中引入Quartz的相关bean。这通常包括`SchedulerFactoryBean`,它是Spring管理...

Global site tag (gtag.js) - Google Analytics