最近在做定时跑批任务的时候用开始接触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&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
相关推荐
该demo集成spring和quartz, 可以定时执行任务, 支持corn表达式, 并持久化数据库
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 何为数据库事务 ...
最基本的ssm 框架 并集成了shiro 主从库,quartz 持久化到数据库
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 何为数据库事务 ...
包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。 18. spring-webmvc-4.1.1.RELEASE.jar 包含...
quartz|[Spring Scheduler,Quartz,分布式调度,集群,mysql持久化等](https://github.com/smltq/spring-boot-demo/blob/master/quartz/HELP.md) shiro|[授权、认证、加解密、统一异常处理]...
l Spring封装Job调度:当任务信息都持久化在DB中之后,我们需要将这些信息读取出来执行具体的业务逻辑操作,这里我们通过ScheduledExecutorFactoryBean来实现对任务的循环调度,比如说可采取每隔5min扫描一次待处理...
Spring Boot+Maven集成 实现持久化Quartz定时任务管理小demo
处理多个持久化单元 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在业务层的应用 第4章 征服数据库 4.1 学习Spring的DAO理念 4.1.1 理解Spring的DataAccessException 4.1.2 与DataSource一起工作 4.1.3 一致的DAO支持 4.2 在Spring中使用...
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...
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 配置缓存...
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 配置缓存...
博客采用vue前后分离,持久层集成tkmapper丰富简单数据交互,支持mysql/sqlserver数据源,实现功能有系统模块:菜单管理、用户管理、角色管理,系统监控:系统日志、接口api、sql监控、可配置化定时任务,工作流程...
博客采用vue前后分离,持久层集成tkmapper丰富简单数据交互,支持mysql/sqlserver数据源,实现功能有系统模块:菜单管理、用户管理、角色管理,系统监控:系统日志、接口api、sql监控、可配置化定时任务,工作流程...
4. **Quartz**:一个功能丰富的任务调度库,支持定时任务、集群和持久化。 5. **Redis**:一个高性能的键值存储数据库,用于缓存和Session管理。 该系统具有以下特点: 1. **模块化设计**:系统采用模块化设计,...
├── entity-- 数据持久化实体类 │ ├── datasources -- 多数据源工具类 │ ├── shiro -- Shiro验证框架 │ ├── task -- Quartz定时任务 │ ├── util -- 工具类 | ├── FreeMarker -- 自定义...
数据持久化实体类│├── datasources -- 多数据源工具类│├── shiro -- Shiro验证框架│├── task -- Quartz定时任务│├── util -- 工具类| ├── FreeMarker -- 自定义FreeMarker标签│├── ...
lenos(p为spring boot版本扩展名)一款快速开发模块化脚手架,采用spring boot 2.0.1+spring+SpringMvc+mybatis+shiro+swagger+ehcache+quartz+freemarker+layui技术开发;实现功能有系统模块:菜单管理、用户管理、...
1.6. 一个完整的Seam 应用程序:宾馆预订范例............................................................................................................ 45 1.6.1. 介绍......................................