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 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 * * ? *" /><!--每两小时执行一次 必须是在整点的时候 偶数整点-->
</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" />
</beans>