欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

quartz定时任务

程序员文章站 2022-05-20 14:20:14
...

需求:让用户表中超过三个月未登陆过的用户修改状态为停用

这个需求我第一时间想到的就是quartz定时任务,每天或每周跑一次定时任务即可完成。


quartz定时任务一般有两种用法,第一种是像每隔一段时间执行一次,第二种就是可以设置为在每天或每月特定时间执行

现在第二种符合我的要求


jar包 为 quartz-1.8.6.jar         spring 为3.1.2的          框架ssh

定时任务其实很简单,如下代码

1.在xml中配置

<bean id="quartzJob" class="com.xurunhan.controller.TestQuartz"></bean>
	<!-- 指定任务的类,方法,是否可同步(即上次为执行完毕的方法是否可以继续执行,true,允许) -->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="quartzJob"></property>     <!-- 对应TestQuartz类,即上边的bean -->
        <property name="targetMethod" value="execute"></property>     <!-- 对应TestQuartz中的eecute方法 -->
        <property name="concurrent" value="false"></property>
    </bean>
    <!-- 设置任务的启动时机(任务触发器) -->
    <bean id="complainCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="jobDetail"></property>
        表达式 (秒 分 时 日 月 周 年)日与周不可以同时出现 ,年可省略 表示:每月的最后一天的23:59:59触发任务,具体可自行百度cron表达式配置自己需要的时间
        <property name="cronExpression" value="0 * * L * ?"></property>
    </bean>  
    <!-- 触发器的调度工厂,可以调度多个任务触发器 -->
    <bean id="complainScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="complainCronTrigger"/>
            </list>
        </property>
    </bean>

2.执行定时任务的类

//定时器类
public class TestQuartz {

	public void execute() {
		//这里写要执行的业务逻辑
		Calendar calendar = Calendar.getInstance();
		System.out.println("定时任务执行==="+calendar.getTime());
	}
}

3.要注意把TestQuartz的方法配置到xml中

4.如果你的quartz和spring版本较高,那么有可能会抛出类找不到的异常

classnotfound      org.springframework.scheduling.quartz.CronTriggerBean

因为较高的spring版本中  没有CronTriggerBean这个类 ,只有CronTriggerFactoryBean这个类

所以只需替换掉就可以了 配置为

org.springframework.scheduling.quartz.CronTriggerFactoryBean

5.如下是两个spring版本中的类

quartz定时任务quartz定时任务

----------------------------------------------------------------

如果你想要使用第一种方式的quartz,即每隔几秒(几分,几小时)执行一次

只需在xml中修改即可,代码如下

 <bean id="quartzJob" class="com.xurunhan.controller.TestQuartz"></bean>
	<!-- 指定任务的类,方法,是否可同步(即上次为执行完毕的方法是否可以继续执行,true,允许) -->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="quartzJob"></property>
        <property name="targetMethod" value="execute"></property>
        <property name="concurrent" value="false"></property>
    </bean>
    <!-- 设置任务的启动时机(任务触发器) -->
    <!--  <bean id="complainCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="jobDetail"></property>
        表达式 (秒 分 时 日 月 周 年)日与周不可以同时出现 ,年可省略 表示:每月的最后一天的23:59:59触发任务
        <property name="cronExpression" value="0 * * L * ?"></property>
    </bean>  -->
    <bean id="complainCronTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <property name="jobDetail" ref="jobDetail" />
        <property name="startDelay" value="10000" />
        <!-- 调度工厂实例化后,经过5秒开始执行调度 -->
        <property name="repeatInterval" value="10000" />
        <!-- 每5秒调度一次 -->
    </bean>
    <!-- 触发器的调度工厂,可以调度多个任务触发器 -->
    <bean id="complainScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="complainCronTrigger"/>
            </list>
        </property>
    </bean>

只需把中间的任务触发器给替换掉即可。


第二天我到公司告诉项目经理我可以写个定时任务完成这个需求,

项目经理告诉我,不用写定时任务了,你直接写个存储过程就行了,至于什么时候执行,这个你就不用管了。


于是,我现在在学习ORACLE存储过程


---- https://blog.csdn.net/qq_18675693/article/details/50413889 

相关标签: 定时任务