最近在邮件提醒的业务里,需要根据后台每个项目的配置定时的向项目联系人推送邮件提醒,这时我明白需要定时任务了,作为java小白,我向同事做了咨询,推荐我使用Quartz,以下便是我在项目里的学习心得。
首先配置文件:
依赖的jar包
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.2.17.RELEASE</version>
</dependency>
配置文件:
<bean id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="1"/>
<property name="maxPoolSize" value="20"/>
<property name="queueCapacity" value="100"/>
<property name="keepAliveSeconds" value="2000"/>
<property name="rejectedExecutionHandler">
<bean class="java.util.concurrent.ThreadPoolExecutor$AbortPolicy"/>
</property>
</bean>
<bean id="quartzManager" class="com.imaster.admin.web.schemajob.QuartzManager">
<property name="scheduler" ref="schedulerManager"/>
</bean>
<bean id="quartzManagerJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="quartzManager"/>
<!--自定义定时管理类的的执行方法, -->
<property name="targetMethod" value="reScheduleJob"/>
<property name="concurrent" value="false"/>
</bean>
<bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="quartzManagerJobDetail"/>
<!-- 延时0秒 执行任务 -->
<property name="startDelay" value="0"/>
<!-- 任务执行周期 1min 是自定义定时任务管理类的执行间隔,以毫秒为单位-->
<property name="repeatInterval" value="60000"/>
</bean>
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="schedulerManager" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerBean"/>
</list>
</property>
<property name="jobFactory" ref="jobFactory"></property>
<property name="taskExecutor" ref="taskExecutor"/>
</bean>
<!--注意标记有背景色的这两行很重要是为了在执行方法中能够注入到需要的service-->
<bean id="jobFactory" class="com.imaster.admin.web.schemajob.JobAdapter"></bean>
quartzManager定义自己的的定时器管理类
1.读取数据库的定时任务的设置数据
2.添加新的定时任务
3.删除已取消的定时任务
4.更新已有的定时任务
QuartzManager
QuartzJobFactory 定义了具体定时任务的执行管理
所有的定时任务都会在时间点执行这个类的execute(),然后我们根据定时任务的TaskType来确定具体的任务,另外注意我这边是直接将我的参数作为taskId了,所有我传入的参数是taskId,如果可以根据自己的业务需要在TaskVO中补充自己的参数
QuartzJobFactory
JobAdapter 这个类其实我没有明白,只能邯郸学步,请见谅,看别人的注释吧。
package com.imaster.admin.web.schemajob;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;
/**
* @Author wanghh
* 2020/5/11 10:17
*/public class JobAdapter extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
//进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
TaskVo 实体类
TaskVo
以上就是我本次需求的处理,说实话,我只是在照葫芦画瓢,以后的项目之余我会逐步的去补充。
另外我和原创都是单台的服务器,所以没有考虑到集群的情况下。