案列
import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 主动监听nacos配置类
*
* @param <T>
*/
@Slf4j
public abstract class NacosAbstractListener<T> implements InitializingBean, Listener {
protected final String clazzSimpleName = getClass().getSimpleName();
@Autowired
private NacosConfigManager nacosConfigManager;
protected T data;
public T getData() {
return data;
}
private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
2, 4, 1, TimeUnit.SECONDS, new LinkedBlockingDeque<>(100),
new ThreadPoolExecutor.CallerRunsPolicy()
);
/**
* 监听-工作线程池
*
* @return
*/
@Override
public Executor getExecutor() {
return threadPoolExecutor;
}
/**
* 接受到Nacos 具体 配置信息变动
*
* @param configInfo
*/
@Override
public void receiveConfigInfo(String configInfo) {
log.info("{}#receiveConfigInfo receive configInfo. configInfo={}", clazzSimpleName, configInfo);
compile(configInfo);
}
@Override
public void afterPropertiesSet() throws Exception {
ConfigService configService = nacosConfigManager.getConfigService();
log.info("configService : {}", configService);
String configInfo = configService.getConfig(getDataId(), getGroupId(), getTimeout());
log.info("{}#afterPropertiesSet init configInfo. configInfo={}", clazzSimpleName, configInfo);
compile(configInfo);
configService.addListener(getDataId(), getGroupId(), this);
}
/**
* 获取nacos dataId
*
* @return nacos dataId
*/
protected abstract String getDataId();
/**
* 获取nacos groupId
*
* @return nacos groupId
*/
protected String getGroupId() {
return "DEFAULT_GROUP";
}
/**
* 获取nacos 超时时间
*
* @return nacos 超时时间
*/
protected long getTimeout() {
return 3000L;
}
/**
* 将输入转为数据
*
* @param dataStr
*/
protected abstract void compile(String dataStr);
}
{
"default":{
"separator": ".",
"rule": "1"
},
"DxMachiningProcess": {
"displayName": "机械加工工艺规程",
"default": "2131"
},
"DxHeatTreatmentProcess": {
"displayName": "热处理工艺",
"default": "2251"
},
"DxGritBlastingProcess": {
"displayName": "吹砂工艺",
"default": "2298"
},
"DxSpringProcess": {
"displayName": "弹簧工艺",
"default": "2296"
},
"DxElectrosparkProcess": {
"displayName": "电火花工艺",
"default": "2141"
},
"DxElectrochemicalProcess": {
"displayName": "电解加工工艺",
"default": "2142"
},
"DxSprayingProcess": {
"displayName": "喷涂工艺",
"default": "2266"
},
"DxTubeBendingProcess": {
"displayName": "弯管工艺",
"default": "2118"
},
"DxWeldingProcess": {
"displayName": "焊接工艺",
"default": "2121",
"电子束焊": "2129"
},
"DxAssembleProcess": {
"displayName": "装配工艺",
"default": "2181"
},
"DxNonDestructiveProcess": {
"displayName": "无损检测工艺",
"X射线检测": "2282a",
"超声波检测": "2282b",
"磁粉检测": "2282c",
"渗透检测": "2282d",
"涡流检测": "2282e",
"氦质谱检漏": "2282f",
"声发射检测": "2282g",
"内窥镜检测": "2282h",
"工业CT检测": "2282i",
"激光全息检测": "2282j",
"退磁": "2282k",
"应力测试": "2282l"
},
"DxSheetMetalProcess": {
"displayName": "钣金冲压工艺",
"冷作": "2118",
"冲压": "2113",
"旋压": "2115"
},
"DxForgingProcess": {
"displayName": "锻造工艺",
"default": "2111"
},
"DxCastingProcess": {
"displayName": "铸造工艺",
"熔模精密铸造": "2102",
"砂型铸造": "2101",
"灌蜡脱蜡": "2198",
"包装箱": "2193"
},
"DxAdditiveProcess": {
"displayName": "增材制造工艺",
"激光选区熔化成形": "2103",
"激光熔化沉积成形": "2103",
"磨料流": "2198"
},
"DxSurfaceTreatmentProcess": {
"displayName": "表面处理工艺",
"separator": "",
"rule": "a",
"阳极氧化": "2165",
"电镀": "2161",
"化学处理": "2198",
"化铣": "2143",
"喷涂": "2167"
},
"DxProductLineProcess": {
"displayName": "产线工艺",
"default": "2071"
}
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.casc.dcs.process.core.config.NacosAbstractListener;
import com.yonde.dex.basedata.exception.DxBusinessException;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.Map;
@Component
public class NacosProcessCodeConfigListener extends NacosAbstractListener<Map<String, Map<String,String>>> {
@Override
protected String getDataId() {
return "process-encode-config";
}
@Override
protected String getGroupId() {
return "BUSINESS_GROUP";
}
@Override
protected void compile(String dataStr) {
data= JSON.parseObject(dataStr,new TypeReference<Map<String, Map<String,String>>>(){});
}
public Map<String, Map<String,String>> getConfig(){
Map<String,Map<String,String>> configMap=getData();
if(CollectionUtils.isEmpty(configMap)){
throw new DxBusinessException(null,"请确认Nacos配置中心中process-encode-config配置是否正确");
}
return configMap;
}
}
import com.casc.dcs.process.core.config.processcode.NacosProcessCodeConfigListener;
import com.casc.dcs.process.core.config.processconfig.NacosProcessDictConfigListener;
import com.yonde.dex.basedata.entity.api.ApiResult;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/ExtConfig")
public class ExtConfigController {
@Autowired
NacosProcessCodeConfigListener nacosProcessCodeConfigListener;
@Autowired
NacosProcessDictConfigListener nacosProcessDictConfigListener;
@ApiOperation("获取ProcessCodeConfig配置")
@GetMapping("getProcessCodeConfig")
public ApiResult getProcessCodeConfig(){
return ApiResult.ok(nacosProcessCodeConfigListener.getData());
}
@ApiOperation("获取ProcessDictConfig配置")
@GetMapping("getProcessDictConfig")
public ApiResult getProcessDictConfig(){
return ApiResult.ok(nacosProcessDictConfigListener.getData());
}
@ApiOperation("获取ProcessDictConfig配置")
@GetMapping("getProcessDictConfigByName")
public ApiResult getProcessDictConfigByName(@RequestParam("name") String name){
Map<String, Map<String, String>> dictDataMap = nacosProcessDictConfigListener.getData();
return ApiResult.ok(dictDataMap.get(name));
}
}