今天搞搞定时任务,用到CronTriggerBean
,踩不少坑,还好都弄明白。现在就来跟大伙儿分享一下我的实践过程。
我是想把cron表达式直接写在代码里的,简单粗暴嘛但是后来一想,这样不够灵活,万一哪天要改个时间,还得重新编译打包,多麻烦。
于是我就琢磨着,能不能把cron表达式存到数据库里,然后让定时任务去读数据库。这样,以后要改时间,直接在数据库里改就行,方便多。搜一圈资料,发现CronTriggerBean
这玩意儿正好能满足我的需求。
得有个地方放定时任务的具体逻辑?我新建一个类,就叫MyTask
,里面写个execute
方法,这里面就是我想要定时执行的代码。
public class MyTask {
public void execute() {
// 这里写你想要定时执行的代码

*("定时任务执行!");
就是配置CronTriggerBean
。我用的是XML配置方式,在Spring的配置文件里加这么一段:
<bean id="myTask" class="*" />
<bean id="jobDetail" class="*.*">
<property name="targetObject" ref="myTask" />
<property name="targetMethod" value="execute" />

</bean>
<bean id="cronTrigger" class="*.*">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="0/5 ?" /> <!-- 这里先随便写一个,后面从数据库读 -->
</bean>
<bean class="*.*">

<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>

- myTask:就是上面写的那个类,用来放具体任务逻辑的。
- jobDetail:这玩意儿是用来告诉Spring,我的任务在哪里,要执行哪个方法。
targetObject
指向myTask
,targetMethod
写上execute
方法名。 - cronTrigger:这就是主角
CronTriggerBean
。jobDetail
属性指向上面配置的jobDetail
,cronExpression
属性就是cron表达式。这里我先随便写个"0/5 ?"
,表示每5秒执行一次。 - SchedulerFactoryBean:把trigger注册一下。
然后,我写个service,用来从数据库里读取cron表达式:
public class MyService {
public String getCronExpressionFromDB() {
// 这里从数据库里读取cron表达式
// ...
return "0 0 12 ?"; // 假设从数据库读到的是每天中午12点执行
我在MyTask
类里加个方法,用来更新CronTriggerBean
的cron表达式:
import *.*;
public class MyTask {
private CronTriggerBean cronTriggerBean;
public void setCronTriggerBean(CronTriggerBean cronTriggerBean) {
* = cronTriggerBean;
public void execute() {
// 这里写你想要定时执行的代码
*("定时任务执行!");
//更新表达式
public void refreshCronExpression() {
String cronExpression = // 从数据库读取cron表达式
try {
*(cronExpression);
Scheduler scheduler = *();
*(*(), *(), cronTriggerBean);
} catch (Exception e) {
//异常处理
在配置文件里面把cronTriggerBean注入进去就完成。
<bean id="myTask" class="*">
<property name="cronTriggerBean" ref="cronTrigger"/>
</bean>
大功告成!我的定时任务就可以从数据库里读取cron表达式,想啥时候执行,直接改数据库就行,再也不用重新编译打包,美滋滋!