设计模式之策略模式
背景:导入功能需要做成根据编码code
或者名称
实现不同的导入逻辑,编码和名称都是可配置的,未知的变化,这里要写通用的导入、校验和具体的导入、校验。至此我想到采用设计模式之策略模式+工厂模式
实现此需求。若有不妥还望指正。
- 自定义注解
- 创建工厂
spring
启动扫描带注解的策略类放入工厂中- 定义接口+方法
- 定义策略类
api
调用根据code
获取对应策略的实现类
至此大致的思路确定下面就是具体的代码实现细节
自定义注解
此处定义了三个属性,目前只用到了一个
import org.springframework.stereotype.Component;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 自定义注解*/
@Retention(RetentionPolicy.RUNTIME) // 作用于运行时
@Target(ElementType.TYPE) // 作用于类上
@Component
public @interface ImportService {String templateCode();int sheetIndex() default 0;String sheetName() default "";
}
创建工厂
定义importRegisterRespository
存储策略实体类信息
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;@Component
public class ImportRegisterRespository {private Map<String, Object> importRegisterRespository = new HashMap<>();public Map<String, Object> getImportRegisterRespository(){return importRegisterRespository;}
}
扫描策略类放入map中
扫描带ImportService
注解的类进行扫描,并放入map
中
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import javax.annotation.PostConstruct;
import java.util.Map;@Component
public class ImportInitiator {@Autowiredprivate ImportRegisterRespository importRegisterRespository;@Autowiredprivate ApplicationContext applicationContext;@PostConstructpublic void init(){Map<String, Object> extensionBeans = applicationContext.getBeansWithAnnotation(ImportService.class);for(Object bean : extensionBeans.values()){Class<?> extensionClz = ClassUtils.getUserClass(bean);ImportService extension = AnnotationUtils.findAnnotation(extensionClz, ImportService.class);String templateCode = extension.templateCode();importRegisterRespository.getImportRegisterRespository().put(templateCode, bean);}}
}
定义接口
定义2个方法,导入和验证
import com.alibaba.fastjson2.JSONObject;
import com.example.demo.dto.importVO.ImportLine;
import java.util.List;public interface IBatchImportItf{List<String> doBatchImport(List<JSONObject> data);Boolean validate(List<ImportLine> importLineList);
}
定义策略类
此类是个半成品,具体的实现还没写完,不过大致思路都成型
可以继续写其他策略类,以此类推
import com.alibaba.fastjson2.JSONObject;
import com.example.demo.dto.importVO.ImportLine;
import com.example.demo.importHandler.init.ImportService;
import org.springframework.stereotype.Component;
import java.util.*;@Component
@ImportService(templateCode = "BASE_IMPORT")
public class BaseImport implements IBatchImportItf {@Overridepublic List<String> doBatchImport(List<JSONObject> data) {List<String> lists = new ArrayList<>();for (JSONObject datum : data) {//插入表中 返回当前的批次号给前端String uuid = UUID.randomUUID().toString();lists.add(uuid);}//前端拿着批号导入正式表中return lists;}@Overridepublic Boolean validate(List<ImportLine> importLineList) {for (ImportLine importLine : importLineList) {//根据uuid去数据库查数据 返回一个listimportLine = new ImportLine(1L,"xxxxx",1,"","具体的json数据");JSONObject jsonObject = new JSONObject();//模拟数据jsonObject.put("order",1);jsonObject.put("age",20);jsonObject.put("gender","M-男");jsonObject.put("province","河南");jsonObject.put("city","郑州");jsonObject.put("country","中原区");//模拟规则 判空规则 根据 sheetCode查出配置的信息Map<String,String> nullableFlagMap = new HashMap<String,String>(){{put("age","Y");put("province","Y");put("city","Y");put("country","Y");}};for (String key : nullableFlagMap.keySet()) {if(Objects.isNull(jsonObject.get(key))){importLine.setMsg(key+"不允许为空");}}//更新 ImportLine 根据 batchId 和 rowIndex 去更新数据库}return null;}
}
api调用
此api
也是个半成品,不过思路已确定
api
分三部分:
1、导入临时表,临时表返回批次id
2、通用验证,根据配置验证,主要是验证必输性,根据第一步的批次id查询数据验证,返回boolean
值,当返回true
再根据具体的策略实现类业务验证
3、导入正式表
import com.alibaba.fastjson2.JSONObject;
import com.example.demo.dto.importVO.ImportLine;
import com.example.demo.dto.importVO.TemplateDO;
import com.example.demo.dto.importVO.TemplateSheet;
import com.example.demo.dto.importVO.TemplateSheetCol;
import com.example.demo.importHandler.IBatchImportItf;
import com.example.demo.importHandler.init.ImportRegisterRespository;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*; @AutowiredImportRegisterRespository importRegisterRespository;@PostMapping("/import/temp")public List<String> importTemp(MultipartFile file) {Optional.ofNullable(file).orElseThrow(() -> new RuntimeException("文件不能为空"));//获取初始化的导入对象Map<String, Object> importServiceMap = importRegisterRespository.getImportRegisterRespository();//先执行basr类 BASE_IMPORTIBatchImportItf baseImport = (IBatchImportItf)importServiceMap.get("BASE_IMPORT");/*1 读取excel数据2 先查出模板配置信息,转换成kv对象,k是排序跟excel的col匹配,v是字段驼峰编码跟excel的值匹配比如:kv - {"1":"city"} excel从左往右读取数据,读到1从kv中获取city再拿excel中的具体值,组装数据{"city":"郑州市"}3 这个就是最终要的结果 {"city":"郑州市","provice":"河南省","gender":"男"}*/InputStream inputStream = null;Workbook workbook = null;try{inputStream = file.getInputStream();workbook = new XSSFWorkbook(inputStream);// 获取工作簿中的所有工作表数量int numberOfSheets = workbook.getNumberOfSheets();List<String> sheetUUID = new ArrayList<>();// 遍历每一个工作表for (int i = 0; i < numberOfSheets; i++) {Sheet sheet = workbook.getSheetAt(i);System.out.println("Sheet name: " + sheet.getSheetName());if (workbook.isSheetHidden(i)) {System.out.println("Sheet is hidden netx one.");continue;}// 检查工作表是否被隐藏// 遍历行// 遍历每一行,从第3行开始(索引为1),第一行是说明,第二行是标题List<JSONObject> list = new ArrayList<>();for (int rowIndex = 2; rowIndex <= sheet.getLastRowNum(); rowIndex++) {Row row = sheet.getRow(rowIndex);if (row == null) {// 如果行为空,则跳过continue;}//模拟查询到数据sheet页列的数据信息HashMap<Integer, String> sheetColMap = new HashMap<Integer, String>() {{put(0, "order");put(1, "age");put(2, "gender");put(3, "province");put(4, "city");put(5, "country");}};JSONObject jsonObject = new JSONObject();// 遍历单元格for (int j = 0; j < Integer.parseInt(String.valueOf(row.getLastCellNum())); j++) {Cell cell = row.getCell(j);String keyName = sheetColMap.get(j);switch (cell.getCellType()) {case STRING:System.out.print(cell.getStringCellValue() + "\t");jsonObject.put(keyName,cell.getStringCellValue());break;case NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {System.out.print(cell.getDateCellValue() + "\t");jsonObject.put(keyName,cell.getDateCellValue());} else {System.out.print(cell.getNumericCellValue() + "\t");jsonObject.put(keyName,cell.getNumericCellValue());}break;case BOOLEAN:System.out.print(cell.getBooleanCellValue() + "\t");jsonObject.put(keyName,cell.getBooleanCellValue());break;case FORMULA:System.out.print(cell.getCellFormula() + "\t");jsonObject.put(keyName,cell.getCellFormula());break;default:System.out.print("UNKNOWN\t");jsonObject.put(keyName,"UNKNOWN");break;}System.out.println(jsonObject);}//至此一行读取完毕list.add(jsonObject);}sheetUUID.addAll(baseImport.doBatchImport(list));}return sheetUUID;} catch (IOException e) {throw new RuntimeException(e);}finally {try {inputStream.close();} catch (IOException e) {throw new RuntimeException(e);}try {workbook.close();} catch (IOException e) {throw new RuntimeException(e);}}}@PostMapping("/import/validate")public void importValidate(@RequestBody List<String> uuidList) {//获取初始化的导入对象Map<String, Object> importServiceMap = importRegisterRespository.getImportRegisterRespository();//先执行base类 BASE_IMPORTIBatchImportItf baseImport = (IBatchImportItf)importServiceMap.get("BASE_IMPORT");//根据uuid查到sheetCode,根据sheetCode在map中找到对应的实现类Boolean baseValidate = baseImport.validate(Arrays.asList(new ImportLine()));//todo 更新ImportLine表的错误信息,只要更新msg字段就代表错误//基础校验通过 继续走业务校验if(baseValidate){for (String uuid : uuidList) {//根据uuid查到sheetCode,根据sheetCode在map中找到对应的实现类String sheetItemCode = "one";IBatchImportItf itemImport = (IBatchImportItf)importServiceMap.get(sheetItemCode);itemImport.validate(Arrays.asList(new ImportLine()));//todo 更新ImportLine表的错误信息,只要更新msg字段就代表错误}}}@PostMapping("/import/business-table")public void importBusinessTable(@RequestBody List<String> uuidList) {for (String uuid : uuidList) {String sheetCode = "one";//根据uuid查到sheetCode 再拿出jsonDate//获取初始化的导入对象Map<String, Object> importServiceMap = importRegisterRespository.getImportRegisterRespository();//先执行base类 BASE_IMPORTIBatchImportItf itemImport = (IBatchImportItf)importServiceMap.get(sheetCode);itemImport.doBatchImport(null);}}
相关文章:
设计模式之策略模式
背景:导入功能需要做成根据编码code或者名称实现不同的导入逻辑,编码和名称都是可配置的,未知的变化,这里要写通用的导入、校验和具体的导入、校验。至此我想到采用设计模式之策略模式工厂模式实现此需求。若有不妥还望指正。 自…...
/etc/sudoers 文件格式解读
文章目录 例如 /etc/sudoers 文件中存在这样一行: ubuntu ALL(ALL:ALL) NOPASSWD: ALL 解释如下: 1. 第一个表示用户名,这意味着此行规则适用于名为 ubuntu 的用户。 2. 接下来等号左边的 ALL 表示允许从任何主机登录当前的用户账户…...
Linux虚拟机网络配置
Linux固定IP 跳转到 cd /etc/sysconfig/network-scripts/ 打开文件并编辑 vim ifcfg-ens33 增加或修改选中内容 重启网卡 systemctl restart network ifconfig -a 查看ip已固定 虚拟机网络编辑器调整 子网IP进行修改,例如本机IP修改为10.212.197.34 此处就修改…...
C++模版特化和偏特化
什么是模版特化 特化的含义:所谓特化,就是将泛型搞得具体化一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const或…...
17. 指针类型和步长概念问题
1. 项目场景: ➣ Jack Qiao对米粒说:“今天有道友遇到一个问题,举个栗子数组 arr[5] { 0 };道友发现&arr[0] 1与&arr 1打印出来的地址竟然不同。”米粒测试后果然是这样。 2. 问题描述 ☑ 举个栗子:数组 arr[5] { 0…...
如何自动下载和更新冰狐智能辅助?
冰狐智能辅助的版本更新非常快,如果设备多的话每次手工更新会非常麻烦,现在分享一种免费的自动下载和安装冰狐智能辅助的方法。 一、安装迅雷浏览器 安装迅雷浏览器1.19.0.4280版本,浏览器用于打开冰狐的官网,以便于从官网下载a…...
C# 数据结构之【队列】C#队列
1. 描述 队列:队列遵循先进先出(FIFO)原则,在一端进行插入操作,在另一端进行删除操作。 2. 应用示例 using System;namespace DataStructure {class Program{static async Task Main(string[] args){// 创建一个队列…...
Java-05 深入浅出 MyBatis - 配置深入 动态 SQL 参数、循环、片段
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
HTML+CSS网页模板,左侧导航,右侧内容,顶部LOGO
网页顶部是网站名称和LOGO,左侧是菜单导航,点击菜单,右侧显示内容。HTMLCSS代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"…...
Redis的基本使用命令(GET,SET,KEYS,EXISTS,DEL,EXPIRE,TTL,TYPE)
目录 SET GET KEYS EXISTS DEL EXPIRE TTL redis中的过期策略是怎么实现的(面试) 上文介绍reids的安装以及基本概念,本章节主要介绍 Redis的基本使用命令的使用 Redis 是一个基于键值对(KEY - VALUE)存储的…...
Spring AOP
目录 1.AOP概述 2.Spring AOP快速实现 3.Spring AOP核⼼概念 编辑 3.1切点(Pointcut) 3.2连接点(Join Point) 3.3通知(Advice) 3.4切⾯(Aspect) 4.通知类型 5.PointCut 6.切⾯优先级 Order 7.annotation 1.AOP概述 (1)什么是AOP…...
SIMD AVX2 向量计算
_mm256_fmadd_ps: 能够在单个操作中执行乘法和加法,从而提高浮点计算的精度和性能。_mm256_sub_ps : Intel Advanced Vector Extensions (AVX) 指令集中用于从两个 AVX 寄存器中逐元素进行单精度浮点数减法的内联函数。这个函数允许同时对 8 个单精度浮点数进行减法…...
clipboard
clipboard 现代复制到剪贴板。无闪光。只有 3kb 的 gzip 压缩。 安装 npm install clipboard --save第三方cdn提供商 <script src"https://cdn.jsdelivr.net/npm/clipboard2.0.11/dist/clipboard.min.js"></script>使用 data-clipboard-target"…...
【JavaEE进阶】 JavaScript
本节⽬标 了解什么是JavaScript, 学习JavaScript的常⻅操作, 以及使⽤JQuery完成简单的⻚⾯元素操作. 一. 初识 JavaScript 1.JavaScript 是什么 JavaScript (简称 JS), 是⼀个脚本语⾔, 解释型或即时编译型的编程语⾔. 虽然它是作为开发Web⻚⾯的脚本语⾔⽽出名,…...
python程序的编写以及发布(形象类比)
最近重新接触python,本人之前对于python的虚拟环境,安装包比较比较迷惑,这里给出一个具象的理解。可以将 Python 程序运行的过程类比成一次 做菜的过程,从准备食材到最后出锅。以下是具体的类比步骤: 1. 安装 Python 环…...
游戏引擎学习第20天
视频参考:https://www.bilibili.com/video/BV1VkBCYmExt 解释 off-by-one 错误 从演讲者的视角:对代码问题的剖析与修复过程 问题的起因 演讲者提到,他可能无意中在代码中造成了一个错误,这与“调试时间标记索引”有关。他发现了一个逻辑问题…...
大数据面试题每日练习--HDFS是如何工作的?
HDFS(Hadoop Distributed File System)是一个分布式文件系统,设计用于存储非常大的文件。它的主要工作原理如下: NameNode:管理文件系统的命名空间,维护文件目录树和文件元数据信息。NameNode记录每个文件…...
高质量 JavaScript
高质量的 JavaScript 非常重要。它能够提升代码的可读性,让其他开发者可以轻松理解代码意图,减少沟通成本和维护难度。同时,合理的代码结构和正确的语法运用能够避免许多潜在的错误和性能问题,例如通过正确处理异步操作来防止程序…...
小白投资理财 - 解读威廉分形指标 Williams Fractals
小白投资理财 - 解读威廉分形指标 Williams Fractals WF 指标WF 的使用止损支撑和阻力 WF 缺点WF 组合使用WF EMAWF 和趋势线 WF 周期设定总结 你有看过这种情况吗?它能够准确的让你知道高点和低点,而且每次都能够完美的预测到反转的信号,其…...
五天SpringCloud计划——DAY2之使用Docker完成项目的部署
一、引言 刚刚学完了Docker的使用,现在知识在脑子里面还是热乎的,是时候把它总结一下了。 现在的我认为Docker时一个部署项目的工具(不知道是不是真的),相比于我以前使用宝塔面板部署项目,使用Docker更能让我看到代码之美,怎么一…...
HarmonyOS4+NEXT星河版入门与项目实战(11)------Button组件
文章目录 1、控件图解2、案例实现1、代码实现2、代码解释3、运行效果4、总结1、控件图解 这里我们用一张完整的图来汇整 Button 的用法格式、属性和事件,如下所示: 按钮默认类型就是胶囊类型。 2、案例实现 这里我们实现一个根据放大和缩小按钮来改变图片大小的功能。 功…...
oracle的静态注册和动态注册
oracle的静态注册和动态注册 静态注册: 静态注册 : 指将实例的相关信息手动告知 listener 侦 听 器 , 可以使用netmgr,netca,oem 以及直接 vi listener.ora 文件来实现静态注册,在动态注册不稳定时使用,特点是:稳定&…...
【系统架构设计师】真题论文: 论软件可靠性设计技术的应用(包括解题思路和素材)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2013年 试题3)解题思路论文素材参考软件可靠性设计技术概念主要的软件可靠性设计技术软件可靠性设计技术的应用流程真题题目(2013年 试题3) 随着软件的日益普及,系统中软件成分不断增加,使得系统对…...
网络运输层之(1)TCP连接管理
网络运输层之(1)TCP连接管理 Author: Once Day Date: 2024年10月22日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客…...
基于阿里云服务器部署静态的website
目录 一:创建服务器实例并connect 二:本地文件和服务器share 三:关于IIS服务器的安装预配置 四:设置安全组 五:建站流程 六:关于备案 一:创建服务器实例并connect 创建好的服务器实例在云…...
Git项目管理
Git项目管理 分区概念:创建本地仓库查看当前仓库的状态工作区添加到暂存区暂存区恢复到工作区工作区提交到本地仓库查看提交日志版本回滚查看版本变更的所有记录分支查看分支创建分支删除分支切换分支合并分支 冲突解决HEAD指针分支使用的一般规范masterdevelopfeat…...
实践指南:EdgeOne与HAI的梦幻联动
在当今快速发展的数字时代,安全和速度已成为网络服务的基石。EdgeOne,作为腾讯云提供的边缘安全加速平台,以其全球部署的节点和强大的安全防护功能,为用户提供了稳定而高效的网络体验。而HAI(HyperApplicationInventor…...
OmniDiskSweeper :一款专为 macOS 设计的磁盘使用分析工具
OmniDiskSweeper 是一款专为 macOS 设计的磁盘使用分析工具,由 The Omni Group 开发。它的主要目的是帮助用户可视化磁盘上的文件和文件夹,并找出占用大量空间的文件,从而帮助用户释放磁盘空间。 OmniDiskSweeper 的特点包括: 简…...
【Git】:Git基本操作
目录 创建、配置本地仓库 创建本地仓库 配置本地仓库 认识工作区、暂存区、版本库 修改文件 版本回退 撤销修改 删除文件 创建、配置本地仓库 创建本地仓库 我们通常可以通过以下两种方式之一获取 Git 存储库: 自己在本地目录创建一个本地仓库 从其它服务…...
C++设计模式:建造者模式(Builder) 房屋建造案例
什么是建造者模式? 建造者模式是一种创建型设计模式,它用于一步步地构建一个复杂对象,同时将对象的构建过程与它的表示分离开。简单来说: 它将复杂对象的“建造步骤”分成多部分,让我们可以灵活地控制这些步骤。通过…...
由于centos停更,yum、docker等不支持,采用阿里云仓库搭建K8S
一:准备 服务器信息主机名IP地址Centos7.9node1-master192.168.35.130Centos7.9node2192.168.35.131 # 查看系统版本 cat /etc/centos-release # 查看内核版本 uname -sr二:服务器前置操作 每个节点都需要操作 #使用 hostnamectl set-hostname设置主机…...
cocos creator 3.8 一些简单的操作技巧,材质的创建 1
这是一个飞机的3D模型与贴图 导入到cocos中,法线模型文件中已经包含了mesh、material、prefab,也就是模型、材质与预制。界面上创建一个空节点Plane,将模型直接拖入到Plane下。新建材质如图下 Effect属性选择builtin-unlit,不需…...
下载安装Android Studio
(一)Android Studio下载地址 https://developer.android.google.cn/studio 滑动到 点击下载文档 打开新网页 切换到english 
随着人口老龄化进程的加速,摔倒事故逐渐成为威胁老年人健康和安全的主要问题之一。研究表明,摔倒不仅可能导致老年人骨折、头部受伤等严重的身体损伤,还可能引发心理恐惧和行动能力下降,从而降低其生活质量和独立性。如何快速、准…...
C++特殊类设计(不能被拷贝的类、只能在堆上创建对象的类、不能被继承的类、单例模式)
C特殊类设计 在实际应用中,可能需要设计一些特殊的类对象,如不能被拷贝的类、只能在堆上创建对象的类、只能在栈上创建对象的类、不能被继承的类、只能创建一个对象的类(单例模式)。 1. 不能被拷贝的类 拷贝只会发生在两个场景…...
Javaweb前端HTML css 整体布局
最后一个是线条颜色 盒子,整体还是300,400...
数据集-目标检测系列- 花卉 鸡蛋花 检测数据集 frangipani >> DataBall
数据集-目标检测系列- 花卉 鸡蛋花 检测数据集 frangipani >> DataBall DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 贵在坚持! 数据样例项目地址: * 相关项目 1)数据集…...
【从零开始的LeetCode-算法】3297. 统计重新排列后包含另一个字符串的子字符串数目 I
给你两个字符串 word1 和 word2 。 如果一个字符串 x 重新排列后,word2 是重排字符串的 前缀,那么我们称字符串 x 是 合法的 。 请你返回 word1 中 合法 子字符串的数目。 示例 1: 输入:word1 "bcca", word2 "…...
【Redis_Day5】String类型
【Redis_Day5】String类型 String操作String的命令set和get:设置、获取键值对mset和mget:批量设置、获取键值对setnx/setex/psetexincr和incrby:对字符串进行加操作decr/decrby:对字符串进行减操作incrbyfloat:浮点数加…...
【CVE-2024-48694】OfficeWeb365 SaveDraw
漏洞描述 OfficeWeb365 v.8.6.1.0和v7.18.23.0中的文件上传漏洞允许远程攻击者通过pw/savedraw组件执行任意代码。 影响版本: V8.6.1.0; V7.18.23.0 网络测绘 “OfficeWeb365” 漏洞信息 POST /PW/SaveDraw?path../../Content/img&idx6.ashx H…...
leecode134.加油站
一开始想的是总体上加油量超过耗油量那么就一定能找到一个起始点可以跑一圈,这个起始点选择补充油量与耗油量差值最大的那gas个点,但是我没仔细审题,这个起始点是索引逐次1绕一圈而不是随便选择,gas[5,8,2,8],cost[6,5…...
分层架构 IM 系统之 Entry 部署模式
在前面的一篇技术短文(分层架构 IM 系统之架构解读)中,对【分层架构】进行了详细分析;今天我们聊一下【入口层】Entry 的部署模式。 Entry 作为 IM 系统整个后端集群的入口,直接与客户端建立 TCP 长连接,E…...
【Java从入门到放弃 之 多线程 四】
多线程 四 多线程 四读写锁的使用代码演示 乐观锁的使用代码演示 信号量代码演示 倒计时门禁代码演示 循环栅栏Condition详解代码案例 多线程 四 读写锁的使用 上一篇我们介绍到了可重入锁,现在我们来介绍读写锁。实际上,使用可重入锁的时候我们就可以…...
OpenHarmony-3.驱动HDF
OpenHarmony HDF 框架 1.OpenHarmony HDF 框架概述 OpenHarmony驱动子系统采用C面向对象编程模型构建,通过平台解耦、内核解耦,兼容不同内核,提供了归一化的驱动平台底座,旨在为开发者提供更精准、更高效的开发环境,力…...
udp_socket
文章目录 UDP服务器封装系统调用socketbind系统调用bzero结构体清0sin_family端口号ip地址inet_addrrecvfromsendto 新指令 netstat -naup (-nlup)包装器 的两种类型重命名方式包装器使用统一可调用类型 关键字 typedef 类型重命名系统调用popen关于inet_ntoa UDP服务器封装 系…...
Java NIO 核心知识总结
在学习 NIO 之前,需要先了解一下计算机 I/O 模型的基础理论知识。还不了解的话,可以参考我写的这篇文章:Java IO 模型详解。 一、NIO 简介 在传统的 Java I/O 模型(BIO)中,I/O 操作是以阻塞的方式进行的。…...
音频信号采集前端电路分析
音频信号采集前端电路 一、实验要求 要求设计一个声音采集系统 信号幅度:0.1mVpp到1Vpp 信号频率:100Hz到16KHz 搭建一个带通滤波器,滤除高频和低频部分 ADC采用套件中的AD7920,转换率设定为96Ksps ;96*161536 …...
PyTorch基础学习03_数学运算自动微分
目录 一、数学运算 1、基本操作 2、三角函数 3、统计学函数 二、保存和加载 三、并行化 四、自动微分 1、相关概念 2、计算梯度 1.标量梯度计算 2.向量梯度计算 3.多标量梯度计算 4.多向量梯度计算 5.矩阵梯度计算 3、梯度上下文控制 1、梯度控制 2、梯度更新…...