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.csdn.net/download/drsbbbl/11818837


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值