Springboot项目定时任务同步第三方数据给开发、测试、和生产环境共同使用。 由于这个定时任务在开发环境、测试环境和生产环境都存在,会出现数据重复同步的情况,怎么处理。
在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:生产环境
至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。
如:spring.profiles.active=dev就会加载application-dev.properties配置文件内容
第一步:
我们只需要在不同开发环境中的properties中增加一个标志即可,
比如增加一个dutyTaskFlag,值取“1”时,表示执行该定时任务,值取“0”时表示不执行该定时任务。
application-dev.properties:
#同步排班定时任务执行标志
task.dutyTaskFlag=0
#同步点位信息定时任务标志
task.locationTaskFlag=0
application-test.properties:
#同步排班定时任务执行标志
task.dutyTaskFlag=0
#同步点位信息定时任务标志
task.locationTaskFlag=0
application-prod.properties:
#同步排班定时任务执行标志
task.dutyTaskFlag=1
#同步点位信息定时任务标志
task.locationTaskFlag=1
第二步:
自定义一个类ConfigBeanValue 接收该配置项的值。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ConfigBeanValue {
@Value("${task.dutyTaskFlag}")
public String dutyTaskFlag;
@Value("${task.locationTaskFlag}")
public String locationTaskFlag;
}
第三步:
在定时任务中,使用该标志进行逻辑控制。
@Slf4j
@Component
@EnableScheduling
public class SyncDutyTask{
@Autowired
private ConfigBeanValue configBeanValue;
/**
*每天零点10分执行一次
*/
@Scheduled(cron="0 10 0 * * ?")
public void syncDuty() {
if(null != configBeanValue){
System.out.println("dsDutyTaskFlag="+configBeanValue.dutyTaskFlag);
System.out.println("dsDutyTaskFlag="+configBeanValue.locationTaskFlag);
if("1".equals(configBeanValue.dutyTaskFlag)){
//ToDo同步
}
}
}
}