java web使用quartz执行定时任务 Spring配置quartz

本文介绍了在Spring MVC项目中如何使用Quartz进行定时任务配置,包括通过CronTriggerFactoryBean指定时间执行任务和SimpleTriggerFactoryBean设置间隔时间执行任务。同时讨论了二者的区别,如CronTriggerFactoryBean适用于精确时间点执行,而SimpleTriggerFactoryBean则适用于间隔执行。文中还展示了在web.xml中引入quartz-config.xml文件,并提供了配置示例,如每两小时执行一次的cron表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

quartz使用maven管理的jar
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
   <groupId>org.quartz-scheduler</groupId>
   <artifactId>quartz</artifactId>
   <version>2.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging
   quartz依赖的包 -->
<dependency>
   <groupId>commons-logging</groupId>
   <artifactId>commons-logging</artifactId>
   <version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections
   quartz依赖的包 -->
<dependency>
   <groupId>commons-collections</groupId>
   <artifactId>commons-collections</artifactId>
   <version>3.2.2</version>
</dependency>

quartz使用spring配置的两种方式

一种是org.springframework.scheduling.quartz.CronTriggerFactoryBean方式,配置指定的时间执行一次任务,如

<property name="cronExpression" value="0 0 */2 * * ? *" />就是30分钟执行一次;

一种是org.springframework.scheduling.quartz.SimpleTriggerFactoryBean方式,配置间隔多长时间执行一次任务,如<property name="repeatInterval" value="3000" />就是指定3秒执行一次任务;

二者是有区别的,CronTriggerBean可以指定在某个点执行任务,而SimpleTriggerBean似乎是做不到的,譬如你指定每天的凌晨23:59:59秒执行任务,只能用CronTriggerBean了。


现在如果你想项目启动的时候就执行任务,后面就按照指定的时间执行任务的话,就需要二者配合使用了。

我的项目是springmvc框架,在web.xml中做如下配置:

<context-param>  

    <param-name>contextConfigLocation</param-name> 

          <param-value>        

        classpath:conf/spring-common.xml,             

        classpath:conf/spring-config.xml,             

        classpath:conf/quartz-config.xml<!--看这里-->          

        </param-value>  

   </context-param> 


quartz-config.xml 文件内容

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">


    <!-- 只用来初始化连接配置 该连接池指定了数据库 该种方式时构造方法注入 -->
    <bean class="com.thundersoft.mdm.utils.redis.RedisDatabasePoolUtil">
        <constructor-arg name="ADDR" index="0" value="127.0.0.1"></constructor-arg>
        <constructor-arg name="PORT" index="1" value="6379"></constructor-arg>
        <constructor-arg name="TIMEOUT" index="2" value="100"></constructor-arg>
        <constructor-arg name="AUTH" index="3" value="huazai"></constructor-arg>
        <!-- <constructor-arg name="AUTH" index="3"><null /></constructor-arg> -->
        <constructor-arg name="MAX_TOTAL" index="4" value="128"></constructor-arg>
        <constructor-arg name="MAX_IDLE" index="5" value="64"></constructor-arg>
        <constructor-arg name="MIN_IDLE" index="6" value="64"></constructor-arg>
        <constructor-arg name="MAX_WAIT_MILLIS" index="7" value="10000"></constructor-arg>
        <constructor-arg name="TEST_ON_BORROW" index="8" value="true"></constructor-arg>

        <constructor-arg name="REDIS_DATABASE" index="9" value="1"></constructor-arg>

        <!-- 一下这种方式 实在类中使用 变量的setXXX方法注入 -->

        <!-- <property name="size" value="100"/>  -->

    </bean>


<!-- 线程执行器配置,用于任务注册 -->
<bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
 
    <property name="corePoolSize" value="10" /><!--核心线程池大小-->
 
    <property name="maxPoolSize" value="100" /><!--线程池最大大小-->
 
    <property name="queueCapacity" value="500" /><!--等待队列大小-->
</bean>    <!-- 启动后立马执行一次设备更新  -->
    <bean class="com.utils.quartz.DeviceOnlineIOS"
          init-method="deviceStatusOnlineIOS">
        <!-- 每次处理设备数量 -->
        <property name="size" value="100"/>
        <!-- 过期时间 单位s(秒) -->
        <property name="second" value="60"/>
    </bean>

    <!--业务逻辑对象 要执行的那个任务所在的类  注册成一个对象bean-->
    <bean id = "device" class = "com.utils.quartz.Device">
        <!-- 每次处理设备数量 为类中的两个变量赋值-->
        <property name="size" value="100"/>
        <!-- 过期时间 单位s(秒) -->
        <property name="second" value="60"/>
    </bean>


    <!-- 设备更新,每两小时执行 -->
    <bean id="deviceJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="device" /><!--要执行的对象-->
        <property name="targetMethod" value="deviceStatus" /><!--对象中要执行的方法-->
        <property name="concurrent" value="false" />
    </bean>

    <!-- 启动后立马执行一次设备更新  -->
    <bean id="deviceTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="startDelay" value="10" /><!--延迟执行 延迟10毫秒 (单位ms)-->

        <property name="jobDetail" ref="deviceJob" /><!--要执行的任务 及通过对象封装的job-->

        <!--这种配置方式 不能在项目启动时立即执行一次  需要在整点其中 如以下  或者 0 0/5 * * * ? * 需要在 没小时的0 5 15 20 25     30 ... 冲整点开始 每次+5分钟  每5分钟执行一次 -->

        <property name="cronExpression" value="0 0 */2 * * ? *" /><!--每两小时执行一次  必须是在整点的时候 偶数整点-->


        <!--<property name="cronExpression" value="0 0/5 * * * ? *" />-->
    </bean>

    <!-- 启动后立马执行一次设备更新 -->
    <bean id="deviceTriggerSimp" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="startDelay" value="10" /> 
        <property name="jobDetail" ref="deviceJob" />
        <property name="repeatInterval" value="0" /><!--时间间隔 每n毫秒执行一次-->
        <property name="repeatCount" value="0" /><!--一共执行多少次 没有该属性 则按照频率一直执行-->
    </bean>

    <!-- 必须将以上的Trigger加入其中 否则不能执行 -->
    <bean lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="deviceTrigger"/>
<ref bean="deviceTriggerSimp"/>
            </list>

        </property>

     <property name="taskExecutor" ref="executor" />

    </bean>
</beans>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值