注册过程
1、注册定时任务,每隔60秒执行一次
@Component
@EnableScheduling
public class CacheTaskVersionMapScan implements SchedulingConfigurer {
@Resource
private CacheversionTask cacheVersionTask;
@Resource
private LogicCalcBeanLoadingTask logicCalcBeanLoadingTask;
@Resource
private LogicTaskTrigger logicTaskTrigger;
@Resource
private TaskTrigger taskTrigger;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar){
taskRegistrar.addTriggerTask(cacheVersionTask,taskTrigger);
taskRegistrar.addTriggerTask(logicCalcBeanLoadingTask,logicTaskTrigger);
}
}
public static String getLogicLoadingTaskCron(){
String cronText "0 * * * * ?";
//通过MCC修改cronText实现动态定时更新
return cronText;
}
2、扫描DB中的配置信息
QOverride
public void run(){
//是否更新开关
if(!MccConfigutil.LoadLogicCalcThriftInterface()){
return;
}
//从缓存中加载需要处理的Bean而非查询缓存,此步骤可以换成直接查缓存
List<DynLogicBean>allUsingLogicBeans loadLogicService.getUsingBeans();
//没有配置任何信息直接跳过
if(CollectionUtils.isEmpty(allUsingLogicBeans)){
return;
}
//得到ApplicationContext中的DefaultListableBeanFactory
GenericApplicationContext context = (GenericApplicationContext)ApplicationContextServiceUtil.getContext();
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory)context.getBeanFactory();
//admin端保证beanname在新建之后不能修改,否则会有很多垃圾bean清理不掉
for(DynLogicBean dynLogicBean allUsingLogicBeans){
//如果spring中注册过,并且版本spring==db,直接跳过
//没有跳过的这些配置要么是新增加的要么是更新过的,直接重新注册即可
defaultListableBeanFactory.registerBeanDefinition(dynLogicBean.getBeanName(), beanDefinitionBuilder.getRawBeanDefinition());
//原来的做法是卸载:defaultListableBeanFactory.removeBeanDefinition(dynLogicBean.getBeanName());
}
}
3、如何解析BD
// 通过BeanDefinitionBuilder创建bean定义
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(ThriftClientProxy.class);
beanDefinitionBuilder.setDestroyMethodName("destroy");
// 添加属性
// 添加必须属性
beanDefinitionBuilder.addPropertyValue("serviceInterface", CMigSupplyCalcThriftService.class);
beanDefinitionBuilder.addPropertyValue("timeout", dynLogicBean.getTimeout());
beanDefinitionBuilder.addPropertyValue("serverDynamicWeight", dynLogicBean.getServerDynamicWeight());
beanDefinitionBuilder.addPropertyValue(