在新闻系统中,我需要网站具备用户定时发布文章的功能,因此考虑使用SpringBoot自带的注解来实现。具体实现思路是,使SpringBoot定时扫描数据库,当发现文章表中,publish_time属性小于当前时间,则更改文章预约发布状态至立即发布。
创建定时任务
在本项目中,创建定时任务类,启动**@EnableScheduling**注解,开启对定时任务的支持。
/**
* 文章发布定时任务
*/
@Configuration //1.标记配置类,使springboot扫描
@EnableScheduling //2.开启定时任务
public class TaskPublishArticles {
@Autowired
private ArticleService articleService;
//添加定时任务,和其执行任务表达式
@Scheduled(cron = "0/3 * * * * ?*")
private void publishArticles () {
//System.out.println("----test----"+ LocalDateTime.now());
//调用自定义文章service,将当前时间该发布的文章类型,改为即时发布
articleService.updateAppointTopublish();
}
}
其中 @EnableScheduling注解的作用是发现注解**@Scheduled**的任务并后台执行。
cron表达式
在注解**@Scheduled**中,需要配置cron表达式来进行任务时间的设定。cron源码中解释了cron各个位置的数值所代表的含义。为了更容易编码,推荐使用如下网站生产cron表达式:Cron
/**
* A cron-like expression, extending the usual UN*X definition to include triggers
* on the second, minute, hour, day of month, month, and day of week.
* <p>For example, {@code "0 * * * * MON-FRI"} means once per minute on weekdays
* (at the top of the minute - the 0th second).
* <p>The fields read from left to right are interpreted as follows.
* <ul>
* <li>second</li>
* <li>minute</li>
* <li>hour</li>
* <li>day of month</li>
* <li>month</li>
* <li>day of week</li>
* </ul>
* <p>The special value {@link #CRON_DISABLED "-"} indicates a disabled cron
* trigger, primarily meant for externally specified values resolved by a
* <code>${...}</code> placeholder.
* @return an expression that can be parsed to a cron schedule
* @see org.springframework.scheduling.support.CronSequenceGenerator
*/
String cron() default "";
实现定时发布
为了实现该操作,需要自己写mapper.xml文件,同时继承自定义的mapper.java类。
<update id="updateAppointToPublish">
update
article
set
is_appoint = 0
where
publish_time <= NOW()
and
is_appoint = 1
</update>
优化
使用该方法实现的定时发布功能,在大流量的情况下会对数据库造成巨大压力,因此可以进一步优化。可以考虑加入消息队列。