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,即每隔几秒(几分,几小时)执行一次
只需在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