spring 整合 quartz 并做 quartz集群配置
首先 理解 quartz :
quartz 主要分为 几个重要的部分:
1.调度器
2.触发器
3.job
对应关系:一个调度器对应n个触发器
一个触发器对应一个 job
一个 job可以对应 n个触发器
调度器 调度所有的触发器,触发器 触发job;(job就是我们写的类)
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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.fulan</groupId>
<artifactId>quartzdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.3.5.RELEASE</spring.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<!-- servlet 3 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
<!-- Spring dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</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-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</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>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.29</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 打War 的一个插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
</plugin>
<!-- 编译插件 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
上配置:
<!-- Quartz集群Schduler -->
<bean id="clusterQuartzScheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- Triggers集成 -->
<property name="triggers">
<list>
<!-- 可以配置多个触发器 --!>
<ref bean="testTrigger" />
<ref bean="doTimeTtt"/>
</list>
</property>
<!-- quartz配置文件路径, 指向cluster配置 -->
<property name="configLocation" value="classpath:quartz.properties" />
<!-- 启动时延期2秒开始任务 -->
<property name="startupDelay" value="2" />
<!-- 保存Job数据到数据库所需的数据源 -->
<property name="dataSource" ref="dataSource" />
<!-- Job接受applicationContext的成员变量名 -->
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<!-- 配置监听器 -->
<property name="schedulerListeners">
<list>
<!-- 配置异常通知监听器 -->
<ref bean="自己的监听类 需要实现 quartz 的监听类"/>
</list>
</property>
</bean>
<bean id="exceptionListener" class="自己的类"/>
<!-- 按周期执行的任务 Trigger-->
<bean id="doTimeTtt" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="testJobDetail"></property>
<property name="cronExpression" value="*/1 * * * * ?"></property>
</bean>
<!-- 定时时间执行的 Trigger-->
<bean id="testTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!-- 对应的 job 任务 可以自己写 也可以使用 spring 管理的 -->
<property name="jobDetail" ref="testTaskJob"/>
<!-- 调度工厂实例化后,经过5秒开始执行调度 -->
<!-- <property name="startDelay" value="5" /> -->
<!-- 每300秒调度一次 -->
<property name="repeatInterval" value="3000"/>
</bean>
<bean id="myJob" class="自己的job类 可以不写 "></bean>
<bean id="myJobTest" class="自己的job类 可以不写"></bean>
<!-- 检查工作的 JobDetail -->
<bean id="testJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 任务完成之后是否依然保留到数据库,默认false -->
<property name="durability" value="true"></property>
<property name="jobClass" value="类的全限类名就是 com.edu......" />
</bean>
<bean id="testTaskJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 任务完成之后是否依然保留到数据库,默认false -->
<property name="durability" value="true"></property>
<property name="jobClass" value="类的全限类名就是 com.edu......" />
</bean>
<!-- JobDetail, 基于JobDetailBean实例化Job Class,可持久化到数据库实现集群 -->
<!--
注意 :::::::坑啊 注意:通过此工厂bean创建的作业详细信息是,而不是 可序列化,因此不适合持久作业存储
。所以当自己的quartz 需要集群的时候 不能使用 自己的类 不实现 job接口 具体查看源码注释 中 MethodInvokingJobDetailFactoryBean
<p><b>NOTE: JobDetails created via this FactoryBean are <i>not</i>
* serializable and thus not suitable for persistent job stores.</b>
* You need to implement your own Quartz Job as a thin wrapper for each case
* where you want a persistent job to delegate to a specific service method.
<bean id="testTaskJob"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
任务完成之后是否依然保留到数据库,默认false
目标类
<property name="targetObject" ref="myJob"/>
目标方法
<property name="targetMethod" value="test"/>
指定是否应以并发方式运行多个作业。 默认 true
<property name="concurrent" value="true"/>
</bean> -->
<!-- Job的可配置属性,在job中通过applicationContext动态获取 -->
可以配置 一些参数
</beans>
注释很详细 不在一一说明了 其中需要注意的地方 就是在当我的 job 想要自己类 不实现任何接口的情况 在 集群的情况不适用 当想要嵌入代码的时候 建议采用代理的方式进行嵌入(无侵入式);
仔细的可以看到有个 propertis
如下所示:
# 为调度器 起一个名字可以随意修改 根据自己想法
org.quartz.scheduler.instanceName = mbbScheduler
#调度器的id名字 AUTO自动起名字 省的出现冲突 集群有用
org.quartz.scheduler.instanceId = AUTO
#去除检查 quartz 更新
org.quartz.scheduler.skipUpdateCheck = true
#使用的线程池 采用 quartz 的线程池(建议)
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
#线程池的中 线程数量 (1-100差不多够用了)
org.quartz.threadPool.threadCount = 10
#线程的优先级 默认 为5
#org.quartz.threadPool.threadPriority = 5
# job 的存储策略 有三种 RAMStore 存储在内存中 会出现 不能持久化的问题 JobStoreTX 不开启事务管理 JobStoreTX
#JobStoreCMT 和你的容器一起管理
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#使用 标准的jdbc 的驱动连接(建议 也还有好多 参数 Oracle 等等 建议 就是 这个 因为 厂商 都支持)
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#超时时间 60s 默认 60s(就是 当我的节点通信出现故障了 比如 一个 是 10:40:10 执行 但是 因为 未知原因延迟了 但是只##要是在 60s 之内,我都是可以忍受的 不算 任务 延迟 代表 延迟忍受时间长度)
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.useProperties = false
#配置表的前缀
org.quartz.jobStore.tablePrefix = QRTZ_
#启用 集群配置
org.quartz.jobStore.isClustered = true
#多长时间 检测一次连接
org.quartz.jobStore.clusterCheckinInterval = 15000
#可以 在调度器中配置 数据源 这里省略 我看网上说 开启集群 必须写这个 不正确 可以 在配置文件中 写
#配置连接数据库的实现类,可以参照IAM数据库配置文件中的配置
#org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
#配置连接数据库连接,可以参照IAM数据库配置文件中的配置
#org.quartz.dataSource.myDS.URL = jdbc:mysql://127.0.0.1:3306/test
#配置连接数据库用户名
#org.quartz.dataSource.myDS.user = root
#配置连接数据库密码
#org.quartz.dataSource.myDS.password = root
#配置连接数据库连接池大小,一般为上面配置的线程池的2倍
#org.quartz.dataSource.myDS.maxConnections = 10
必须要 实现的接口 当你开启了 集群配置
在doc下 有建表语句 ,建表 开启 测试
监听器:
调度错误处理::;;
代码 我打包 发出来
https://download.****.net/download/drsbbbl/11818837