问题:
我在项目中使用spring 的@Scheduled 标签来完成定时任务配置,现在需要打包部署两个节点,需要通过配置的方式控制是否开启定时任务
解决方案:
Spring boot中有个注解@ConditionalOnProperty,这个注解能够控制某个configuration是否生效。
具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;
如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。
如果返回值为false,则该configuration不生效;为true则生效。
例:
Springboot 配置文件中添加转化开关:
task.switch=true
定时任务配置:
package com.meilitech.zhongyi.resource.task;
import com.meilitech.zhongyi.resource.service.UpdateRankService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* @author gzy
*/
@Configuration
@ConditionalOnProperty(name = "task.switch", havingValue = "true")
@Component
public class UpdateRankTasks {
private static final Logger log = LoggerFactory.getLogger(UpdateRankTasks.class);
@Autowired
UpdateRankService updateRankService;
/**
* 每天凌晨1点执行一次 0 0 1 * * ?
* 获取rank值并更新到resource定时任务
*/
@Scheduled(cron = "0 0 1 * * ?")
public void updateRank() {
log.info("----------------------更新Rank值定时任务开始---------------------");
updateRankService.getAndUpdateRank();
log.info("----------------------更新Rank值定时任务结束---------------------");
}
}