当前位置: 首页 > news >正文

做一个网站需要多长时间南宁 网站开发

做一个网站需要多长时间,南宁 网站开发,低价网站空间,个人网站做什么内容要实现配置自动实时刷新#xff0c;需要改造之前的代码。代码在https://gitee.com/summer-cat001/config-center​​​​​​​ 服务端改造 服务端增加一个版本号version#xff0c;新增配置的时候为1#xff0c;每次更新配置就加1。 Overridepublic long insertConfigDO(…要实现配置自动实时刷新需要改造之前的代码。代码在https://gitee.com/summer-cat001/config-center​​​​​​​ 服务端改造 服务端增加一个版本号version新增配置的时候为1每次更新配置就加1。 Overridepublic long insertConfigDO(ConfigDO configDO) {insertLock.lock();try {long id 1;ListConfigDO configList getAllConfig();if (!configList.isEmpty()) {id configList.get(configList.size() - 1).getId() 1;}configDO.setId(id);configDO.setVersion(1);Optional.of(configDO).filter(c - c.getCreateTime() null).ifPresent(c - c.setCreateTime(LocalDateTime.now()));String configPathStr standalonePath /config;Files.createDirectories(Paths.get(configPathStr));Path path Paths.get(configPathStr / id .conf);Files.write(path, JSON.toJSONString(configDO).getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE_NEW);return id;} catch (Exception e) {throw new RuntimeException(e);} finally {insertLock.unlock();}}Overridepublic void updateConfig(ConfigDO configDO) {ConfigDO dbConfigDO getConfig(configDO.getId());Optional.ofNullable(dbConfigDO).map(c - {c.setName(configDO.getName());c.setVersion(c.getVersion() 1);c.setUpdateTime(LocalDateTime.now());c.setUpdateUid(configDO.getUpdateUid());c.setConfigData(configDO.getConfigData());return c;}).ifPresent(this::updateConfigDO);} 再增加一个接口判断verion是否发生变化 GetMapping(/change/get)public ResultListConfigVO getChangeConfig(RequestBody MapLong, Integer configIdMap) {if (configIdMap null || configIdMap.isEmpty()) {return Result.fail(配置参数错误);}ResultListConfigBO result configService.getAllValidConfig();if (result.failed()) {return Result.resultToFail(result);}return Result.success(result.getData().stream().filter(c - configIdMap.containsKey(c.getId())).filter(c - c.getVersion() configIdMap.get(c.getId())).map(this::configBO2ConfigVO).collect(Collectors.toList()));} 客户端改造 客户端对获取到的配置做了一下改造把json转换成了property格式即user.namexxx。并且存储到了一个以配置ID为key配置对象ConfigBO为value的map configMap里。具体的结构如下 Data public class ConfigBO {/*** 配置id*/private long id;/*** 配置版本号*/private int version;/*** 配置项列表*/private ListConfigDataBO configDataList; } Data public class ConfigDataBO {/*** 配置key*/private String key;/*** 配置值*/private String value;/*** 自动刷新的bean字段列表*/ListRefreshFieldBO refreshFieldList;public void addRefreshField(RefreshFieldBO refreshFieldBO) {Optional.ofNullable(refreshFieldList).orElseGet(() - refreshFieldList new ArrayList()).add(refreshFieldBO);} } Data AllArgsConstructor public class RefreshFieldBO {/*** 对象实例*/private Object bean;/*** 字段*/private Field field; }获取配置和之前一样只不过调用的位置改成了ConfigCenterClient中将配置转换成配置key配置值的map提供给外部程序调用 public ConfigCenterClient(String url) {this.url url;//将配置中心的配置转换成property格式即user.namexxxListConfigVO configList getAllValidConfig();this.configMap Optional.ofNullable(configList).map(list - list.stream().map(configVO - {MapString, Object result new HashMap();DataTransUtil.buildFlattenedMap(result, configVO.getConfigData(), );ConfigBO configBO new ConfigBO();configBO.setId(configVO.getId());configBO.setVersion(configVO.getVersion());configBO.setConfigDataList(result.entrySet().stream().map(e - {ConfigDataBO configDataBO new ConfigDataBO();configDataBO.setKey(e.getKey());configDataBO.setValue(e.getValue().toString());return configDataBO;}).collect(Collectors.toList()));return configBO;}).collect(Collectors.toMap(ConfigBO::getId, Function.identity(), (k1, k2) - k1))).orElseGet(HashMap::new);} public MapString, String getConfigProperty() {return configMap.values().stream().map(ConfigBO::getConfigDataList).filter(Objects::nonNull).flatMap(List::stream).collect(Collectors.toMap(ConfigDataBO::getKey, ConfigDataBO::getValue, (k1, k2) - k1));} 使用方式 public class ClientTest {private String userName;private String userAge;private ListObject education;public ClientTest() {ConfigCenterClient configCenterClient new ConfigCenterClient(http://localhost:8088);MapString, String configProperty configCenterClient.getConfigProperty();this.userName configProperty.get(user.name);this.userAge configProperty.get(user.age);this.education new ArrayList();int i 0;while (configProperty.containsKey(user.education[ i ])) {education.add(configProperty.get(user.education[ (i) ]));}}public String toString() {return 姓名: userName ,年龄: userAge ,教育经历: education;}public static void main(String[] args) {ClientTest clientTest new ClientTest();System.out.println(clientTest);} }好了改造完毕下面开始进入正题 短轮询 短轮询就是客户端不断的去请求/config/change/get接口判断配置是否发生了变化如果发生了变化返回给客户端客户端拿到新配置后通过反射修改对象的成员变量 首先将需要实时刷新的配置加入到自动刷新的bean字段列表中然后启动一个定时任务1秒钟访问一次/config/change/get接口如果有变化更新本地配置map并刷新对象中的配置成员变量 public void addRefreshField(String key, RefreshFieldBO refreshFieldBO) {configMap.values().stream().map(ConfigBO::getConfigDataList).filter(Objects::nonNull).flatMap(List::stream).filter(configDataBO - configDataBO.getKey().equals(key)).findFirst().ifPresent(configDataBO - configDataBO.addRefreshField(refreshFieldBO));} public void startShortPolling() {Thread thread new Thread(() - {while (!Thread.interrupted()) {try {Thread.sleep(1000);MapLong, ListConfigDataBO refreshConfigMap new HashMap();configMap.values().forEach(configBO - {Optional.ofNullable(configBO.getConfigDataList()).ifPresent(cdList - cdList.stream().filter(cd - cd.getRefreshFieldList() ! null !cd.getRefreshFieldList().isEmpty()).forEach(refreshConfigMap.computeIfAbsent(configBO.getId(), k1 - new ArrayList())::add));});if (refreshConfigMap.isEmpty()) {return;}MapString, Integer configIdMap refreshConfigMap.keySet().stream().collect(Collectors.toMap(String::valueOf, configId - configMap.get(configId).getVersion()));HttpRespBO httpRespBO HttpUtil.httpPostJson(url /config/change/get, JSON.toJSONString(configIdMap));ListConfigVO configList httpResp2ConfigVOList(httpRespBO);if (configList.isEmpty()) {continue;}configList.forEach(configVO - {MapString, Object result new HashMap();DataTransUtil.buildFlattenedMap(result, configVO.getConfigData(), );ConfigBO configBO this.configMap.get(configVO.getId());configBO.setVersion(configVO.getVersion());ListConfigDataBO configDataList configBO.getConfigDataList();MapString, ConfigDataBO configDataMap configDataList.stream().collect(Collectors.toMap(ConfigDataBO::getKey, Function.identity()));result.forEach((key, value) - {ConfigDataBO configDataBO configDataMap.get(key);if (configDataBO null) {configDataList.add(new ConfigDataBO(key, value.toString()));} else {configDataBO.setValue(value.toString());ListRefreshFieldBO refreshFieldList configDataBO.getRefreshFieldList();if (refreshFieldList null) {refreshFieldList new ArrayList();configDataBO.setRefreshFieldList(refreshFieldList);}refreshFieldList.forEach(refreshFieldBO - {try {Field field refreshFieldBO.getField();field.setAccessible(true);field.set(refreshFieldBO.getBean(), value.toString());} catch (Exception e) {log.error(startShortPolling set Field error, e);}});}});});} catch (Exception e) {log.error(startShortPolling error, e);}}});thread.setName(startShortPolling);thread.setDaemon(true);thread.start();} public class ClientTest {private String userName;private String userAge;private ListObject education;public ClientTest() throws NoSuchFieldException {ConfigCenterClient configCenterClient new ConfigCenterClient(http://localhost:8088);MapString, String configProperty configCenterClient.getConfigProperty();this.userName configProperty.get(user.name);this.userAge configProperty.get(user.age);this.education new ArrayList();int i 0;while (configProperty.containsKey(user.education[ i ])) {education.add(configProperty.get(user.education[ (i) ]));}configCenterClient.addRefreshField(user.name, new RefreshFieldBO(this, ClientTest.class.getDeclaredField(userName)));configCenterClient.startShortPolling();}public String toString() {return 姓名: userName ,年龄: userAge ,教育经历: education;}public static void main(String[] args) throws NoSuchFieldException, InterruptedException {ClientTest clientTest new ClientTest();while (!Thread.interrupted()) {System.out.println(clientTest);Thread.sleep(1000);}} } 效果 修改配置
http://www.pierceye.com/news/73255/

相关文章:

  • 纯静态网站做优化有什么影响建筑专业名词网站
  • 沈阳市网站设计制作公司山东新昌隆建设咨询有限公司网站
  • 零基础网站建设教学网站seo优化多少钱
  • 网站建设技术服务公司烟台网站建设加企汇互联专业
  • 做网站的例子wordpress性能优化插件
  • 网站开发验收报告模板wordpress 分类信息插件
  • 做汽车配件的都在那个网站做呀手机网站功能
  • 通付盾 网站建设青岛做网站方案
  • 网站根 html搜索引擎优化ppt
  • 网站防止恶意注册如何创建网站的二维码
  • 石家庄网站制作网页公司变更经营范围需要哪些资料
  • 连云港做网站优化网页设计与制作教程教科书
  • 湖南省建设工程网站注册东莞的公司可以买深圳社保吗
  • wordpress 编辑器标签网站运营优化方案
  • 江苏建站服务做高大上分析的网站
  • 手机网站样例wordpress编辑器器更换
  • 网站建设 牛商网技术提供互联网营销公司排名
  • 公司网站开发费能记研发费用哪个科目枸橼酸西地那非片的功效与作用
  • 栾城区城乡建设局网站湖州医院网站建设方案
  • html5购物网站扬州建站公司
  • HTMT超链接网站怎么做wordpress怎么设置访问不了
  • 免费的html大作业网站昆明网站建设流程
  • 一个人免费视频在线观看高清佛山网站优化公司排名
  • 合肥建设局网站官网做网站商城多少钱
  • 网站做淘宝联盟凡科网做网站贵吗
  • 网站建设及维护服务珠海事件最新进展
  • 网站点播视频如何做wordpress专栏
  • 怎么看网站发的外链贵州微信网站建设
  • 中国建设银行网站的机构简介网站建设流程
  • 重庆手机网站推广价格网站建设教程在线