文档章节

quartz - 与spring集成

细肉云吞
 细肉云吞
发布于 2017/05/10 17:06
字数 1164
阅读 37
收藏 1

1. 引入依赖

在本文中,JDBC连接池使用DRUID

<dependencies>
            <!-- quartz -->
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz</artifactId>
                <version>2.2.3</version>
            </dependency>
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz-jobs</artifactId>
                <version>2.2.3</version>
            </dependency>

            <!-- Spring -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>4.2.9.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.2.9.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>4.2.9.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>4.2.9.RELEASE</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>4.2.9.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>4.2.9.RELEASE</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>4.2.9.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>4.2.9.RELEASE</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>4.2.9.RELEASE</version>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>4.2.9.RELEASE</version>
            </dependency>

            <!-- 日志 -->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.7</version>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.41</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.0.29</version>
            </dependency>

            <!-- 测试 -->
            <!-- junit -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>4.2.9.RELEASE</version>
                <scope>test</scope>
            </dependency>

        </dependencies>

2. web.xml加入spring容器启动监听

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         id="WebApp_ID" version="3.0">
    <display-name>quartz-spring</display-name>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--加载spring的配置文件 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/spring-context.xml</param-value>
    </context-param>

    <!--filter配置,解决编码问题 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

3. 配置quartz

spring支持两种JOB创建方式,一种是继承QuartzJobBean,它有一个由spring的org.springframework.scheduling.quartz.JobDetailFactoryBean工厂创建;另一种是JOB类不需要继承任何类,它的执行类可以指定任何方法,由spring的工厂org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean 创建。

如果从灵活性来说,第二种方式是最灵活的,因为它只需配置执行方法即可,没有侵入性,但是,** 在quartz集群中需要做JDBC持久化,这时这种创建job方式会抛错 **

Java.io.NotSerializableException: Unable to serialize JobDataMap for insertion into database because the value of property 'methodInvoker' is not serializable: org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

下面代码是两种JOB的类

public class MyJob1 extends QuartzJobBean {
    private final Logger logger = LoggerFactory.getLogger(MyJob1.class);

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        logger.info("MyJob1 execute");
    }
}
public class MyJob2 {
    private final Logger logger = LoggerFactory.getLogger(MyJob2.class);

    public void execute() {
        logger.info("MyJob2 execute");
    }
}

spring配置两个触发器,一个是simpleTrigger,另一个是cornTrigger,前一个触发器注册myjob1,后一个触发器注册myjob2

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/context
						http://www.springframework.org/schema/context/spring-context.xsd">

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="locations">
            <list>
                <value>classpath:jdbc.properties</value>
            </list>
        </property>
    </bean>

    <!--jdbc数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 基本属性 url、user、password -->
        <property name="url" value="${connection.url}"/>
        <property name="username" value="${connection.username}"/>
        <property name="password" value="${connection.password}"/>

        <!-- 配置初始化大小、最小、最大 -->
        <property name="initialSize" value="${druid.initialSize}"/>
        <property name="minIdle" value="${druid.minIdle}"/>
        <property name="maxActive" value="${druid.maxActive}"/>

        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="${druid.maxWait}"/>
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}"/>

        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}"/>

        <property name="validationQuery" value="${druid.validationQuery}"/>
        <property name="testWhileIdle" value="${druid.testWhileIdle}"/>
        <property name="testOnBorrow" value="${druid.testOnBorrow}"/>
        <property name="testOnReturn" value="${druid.testOnReturn}"/>

        <!-- 打开PSCache,并且指定每个连接上PSCache的大小  如果用Oracle,则把poolPreparedStatements配置为true,mysql可以配置为false。-->
        <property name="poolPreparedStatements" value="${druid.poolPreparedStatements}"/>
        <property name="maxPoolPreparedStatementPerConnectionSize"
                  value="${druid.maxPoolPreparedStatementPerConnectionSize}"/>

        <!-- 配置监控统计拦截的filters -->
        <property name="filters" value="${druid.filters}"/>

    </bean>

    <!--方式一,MyJob1需要继承QuartzJobBean-->
    <bean id="myJobDetailBean1" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="name" value="job_name_myjob1"/>
        <property name="jobClass" value="com.github.thinwonton.quartz.job.MyJob1"/>
        <!-- 默认为false,当没有活动的触发器与之相关联时会在调度器中删除该job -->
        <property name="durability" value="false"></property>
    </bean>

    <!--方式二,MyJob2只需要指定要执行的方法即可-->
    <bean id="myJob2" class="com.github.thinwonton.quartz.job.MyJob2"/>
    <bean id="myJobDetailBean2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="name" value="job_name_myjob2"/>
        <property name="targetObject" ref="myJob2"/>
        <property name="targetMethod" value="execute"/>
    </bean>

    <!-- 定义simpleTrigger触发器,每10秒触发一次,共8次 -->
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="myJobDetailBean1"></property>
        <property name="repeatCount">
            <value>8</value>
        </property>
        <property name="repeatInterval">
            <value>10000</value>
        </property>
        <property name="startDelay">
            <value>4</value>
        </property>
    </bean>

    <!-- 另一种触发器是CornTrigger -->
    <bean id="cornTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="myJobDetailBean2"/>
        <!-- 每个10秒触发 -->
        <property name="cronExpression" value="0/10 * * * * ?"/>
    </bean>

    <!--调度工厂-->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="schedulerName" value="myScheduler"/>
        <property name="triggers">
            <list>
                <ref bean="simpleTrigger"/>
                <!--
                    如果加入myJob2,启用持久化的方式,将抛未持久化的异常
                    <ref bean="cornTrigger"/>
                -->
            </list>
        </property>
        <property name="autoStartup" value="true"/>
        <property name="dataSource" ref="dataSource"/>
        <property name="quartzProperties">
            <props>
                <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
                <prop key="org.quartz.threadPool.threadCount">3</prop>
                <prop key="org.quartz.threadPool.threadPriority">5</prop>
                <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
                <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
                <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
                <prop key="org.quartz.jobStore.tablePrefix">qrtz_</prop>
              <!--
                集群配置
                <prop key="org.quartz.jobStore.isClustered">true</prop>
                <prop key="org.quartz.jobStore.clusterCheckinInterval">20000</prop>
                -->
            </props>
        </property>
    </bean>
</beans>

© 著作权归作者所有

细肉云吞
粉丝 116
博文 190
码字总数 152182
作品 0
其它
高级程序员
私信 提问
Spring Boot--自定义Starter之spring-boot-starter-quartz

痛点 在Spring中使用计划任务,有两种方案可供选择:一、用Spring原生的计划任务,使用起来非常简单,只需要用到@Scheduled注解即可;二、集成Quartz来做计划任务,需要配置大量的Quartz原生...

大大枣
2018/04/03
0
0
项目ITP(五) spring4.0 整合 Quartz 实现任务调度

2014-05-16 22:51 by Jeff Li 前言   系列文章:[传送门]   项目需求:     二维码推送到一体机上,给学生签到扫描用。然后需要的是 上课前20分钟 ,幸好在帮带我的学长做 p2p 的时候...

泥沙砖瓦浆木匠
2014/05/16
0
0
关于spring 注解,初始化的问题

前段时间用quartz,集成于spring,有些问题,特记下来,spring的初始化,这个想必在独立程序中是没有多大的问题的,因为应用spring和quartz的集成完成动态任务的更新,@Service , @Resourc...

石头哥哥
2013/03/10
0
0
项目ITP(六) spring4.0 整合 Quartz 实现动态任务调度

2014-05-18 12:51 by Jeff Li 前言   系列文章:[传送门]   项目需求:      http://www.cnblogs.com/Alandre/p/3733249.html      上一博客写的是基本调度,后来这只能用于,...

泥沙砖瓦浆木匠
2014/05/18
0
0
Spring整合Quartz(JobDetailBean方式)

一、Spring创建JobDetail的两种方式 定时任务两种方式,Spring很好的封装使用Quartz的细节,第一种方式是利用SPring封装的Quartz类进行特定方法的实现,第二种是通过透明的使用Quartz达到定时...

Leons
2015/08/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

android6.0源码分析之Camera API2.0下的Preview(预览)流程分析

本文将基于android6.0的源码,对Camera API2.0下Camera的preview的流程进行分析。在文章android6.0源码分析之Camera API2.0下的初始化流程分析中,已经对Camera2内置应用的Open即初始化流程进...

天王盖地虎626
25分钟前
1
0
java 序列化和反序列化

1. 概述 序列恢复为Java对象的过程。 对象的序列化主要有两 首先我们介绍下序列化和反序列化的概念: 序列化:把Java对象转换为字节序列的过程。 反序列化:把字节序列恢复为Java对象的过程。...

edison_kwok
37分钟前
1
0
分布式数据一致性

狼王黄师傅
今天
2
0
经验

相信每位开发者在自己开发的过程中,都会反思一些问题,比如怎样提高编程能力、如何保持心态不砍产品经理、996 之后怎样恢复精力……最近开发者 Tomasz Łakomy 将他 7 年的开发生涯中学习到...

WinkJie
今天
4
0
从源码的角度来看SpringMVC

SpringMVC核心流程图 简单总结 首先请求进入DispatcherServlet 由DispatcherServlet 从HandlerMappings中提取对应的Handler 此时只是获取到了对应的Handle,然后得去寻找对应的适配器,即:H...

骚年锦时
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部