使用SpringBoot构建定时任务

在新闻系统中,我需要网站具备用户定时发布文章的功能,因此考虑使用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 &lt;= NOW()
and
    is_appoint = 1
</update>

优化

使用该方法实现的定时发布功能,在大流量的情况下会对数据库造成巨大压力,因此可以进一步优化。可以考虑加入消息队列。