【分布式事务Seata源码解读二】Client端启动流程
本文从源码的角度分析一下AT模式下Client端启动流程,所谓的Client端,即业务应用方。分布式事务分为三个模块:TC、TM、RM。其中TC位于seata-server端,而TM、RM通过SDK的方式运行在client端。
下图展示了Seata官方Demo的一个分布式事务场景,分为如下几个微服务,共同实现了一个下订单、扣库存、扣余额的分布式事务。
- BusinessService: 业务服务,下单服务的入口
- StorageService: 库存微服务,用于扣减商品库存
- OrderService: 订单微服务,创建订单
- AccountService: 账户微服务,扣减用户账户的余额
从上图也可以看出,在AT模式下Seata Client端主要通过如下三个模块来实现分布式事务:
- GlobalTransactionScanner: GlobalTransactionScanner负责初始TM、RM模块,并为添加分布式事务注解的方法添加拦截器,拦截器负责全局事务的开启、提交或回滚
- DatasourceProxy: DatasourceProxy为DataSource添加拦截,拦截器会拦截所有SQL执行,并作为RM事务参与方的角色参与分布式事务执行。
- Rpc Interceptor: 在上一篇分布式事务Seata源码解读一中有提到分布式事务的几个核心要点,其中有一个是分布式事务的跨服务实例传播。Rpc Interceptor的职责就是负责在多个微服务之间传播事务。
seata-spring-boot-starter
引用seata分布式事务SDK有两种方式,依赖seata-all或者seata-spring-boot-starter,推荐使用seata-spring-boot-starter,因为该starter已经自动注入了上面提到的三个模块,用户只要添加相应的配置,在业务代码添加全局分布式事务注解即可。下面从seata-spring-boot-starter项目中的代码入手:
如下图所示是seata-spring-boot-starter的项目结构: 主要分为以下几个模块:
- properties: properties目录下都是Springboot 适配seata的相关配置类,即可以通过SpringBoot的配置方式来Seata的相关参数
- provider: provider目录下的类负责把Springboot、SpringCloud的配置适配到Seata配置中
- resources: resources目录下主要有两个文件,spring.factories用于注册Springboot的自动装配类,ExtConfigurationProvider用于注册SpringbootConfigurationProvider类,该Provider类负责把SpringBoot的相关配置类适配到Seata中。
对于springboot-starter项目,我们先查看resources/META-INF/spring.factories文件:
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
io.seata.spring.boot.autoconfigure.SeataAutoConfiguration
可以看到在spring.factories中配置了自动装配类:SeataAutoConfiguration,在该装配类中主要注入了GlobalTransactionScanner和seataAutoDataSourceProxyCreator两个实例。代码如下:
@ComponentScan(basePackages = "io.seata.spring.boot.autoconfigure.properties")
@ConditionalOnProperty(prefix = StarterConstants.SEATA_PREFIX, name = "enabled",havingValue = "true",matchIfMissing = true)
@Configuration
@EnableConfigurationProperties({SeataProperties.class})
public class SeataAutoConfiguration {...// GlobalTransactionScanner负责为添加GlobalTransaction注解的方法添加拦截器,// 并且负责初始化RM、TM@Bean@DependsOn({BEAN_NAME_SPRING_APPLICATION_CONTEXT_PROVIDER, BEAN_NAME_FAILURE_HANDLER})@ConditionalOnMissingBean(GlobalTransactionScanner.class)public GlobalTransactionScanner globalTransactionScanner(SeataProperties seataProperties,FailureHandler failureHandler) {if (LOGGER.isInfoEnabled()) {LOGGER.info("Automatically configure Seata");}return new GlobalTransactionScanner(seataProperties.getApplicationId(),seataProperties.getTxServiceGroup(),failureHandler);}// SeataAutoDataSourceProxyCreator负责为Spring中的所有DataSource生成代理对象,// 从而实现拦截所有SQL的执行@Bean(BEAN_NAME_SEATA_AUTO_DATA_SOURCE_PROXY_CREATOR)@ConditionalOnProperty(prefix = StarterConstants.SEATA_PREFIX, name = {"enableAutoDataSourceProxy", "enable-auto" +"-data-source-proxy"}, havingValue = "true", matchIfMissing = true)@ConditionalOnMissingBean(SeataAutoDataSourceProxyCreator.class)public SeataAutoDataSourceProxyCreator seataAutoDataSourceProxyCreator(SeataProperties seataProperties) {return new SeataAutoDataSourceProxyCreator(seataProperties.isUseJdkProxy(),seataProperties.getExcludesForAutoProxying());}
}
GlobalTransactionScanner
GlobalTransactionScanner继承于AutoProxyCreator,AutoProxyCreator是Spring中实现AOP的一种方式,可以拦截Spring中的所有实例,判断是否需要进行代理。下面列出了GlobalTransactionScanner中一些比较重要的字段和拦截代理的核心方法:
public class GlobalTransactionScanner extends AbstractAutoProxyCreatorimplements InitializingBean, ApplicationContextAware,DisposableBean {...// interceptor字段是对应一个代理对象的拦截器,// 可以认为是一个临时变量,有效期是一个被代理对象private MethodInterceptor interceptor;// globalTransactionalInterceptor是通用的Interceptor,// 非TCC事务方式的都使用该Interceptorprivate MethodInterceptor globalTransactionalInterceptor;// PROXYED_SET存储已经代理过的实例,防止重复处理private static final Set<String> PROXYED_SET = new HashSet<>();// applicationId是一个服务的唯一标识,// 对应springcloud项目中的spring.application.nameprivate final String applicationId;// 事务的分组标识,参考文章wiki:http://seata.io/zh-cn/docs/user/transaction-group.htmlprivate final String txServiceGroup;...// 判断是否需要代理目标对象,如果需要代理,则生成拦截器赋值到类变量interceptor中@Overrideprotected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {// 判断是否禁用分布式事务if (disableGlobalTransaction) {return bean;}try {synchronized (PROXYED_SET) {if (PROXYED_SET.contains(beanName)) {return bean;}// 每次处理一个被代理对象时先把interceptor置为null,所以interceptor的// 生命周期是一个被代理对象,由于是在另外一个方法getAdvicesAndAdvisorsForBean// 中使用interceptor,所以该interceptor要定义为一个类变量interceptor = null;// 判断是否是TCC事务模式,判断的主要依据是方法上是否有TwoPhaseBusinessAction注解if (TCCBeanParserUtils.isTccAutoProxy(bean, beanName,applicationContext)) {// 创建一个TCC事务的拦截器interceptor =new TccActionInterceptor(TCCBeanParserUtils.getRemotingDesc(beanName));} else {// 获取待处理对象的class类型Class<?> serviceInterface = SpringProxyUtils.findTargetClass(bean);// 获取待处理对象继承的所有接口Class<?>[] interfacesIfJdk = SpringProxyUtils.findInterfaces(bean);// 如果待处理对象的class或者继承的接口上有GlobalTransactional注解,// 或者待处理对象的class的任一个方法上有GlobalTransactional或者// GlobalLock注解则返回true,即需要被代理if (!existsAnnotation(new Class[]{serviceInterface})&& !existsAnnotation(interfacesIfJdk)) {return bean;}// 如果interceptor为null,即不是TCC模式,// 则使用globalTransactionalInterceptor作为拦截器if (interceptor == null) {// globalTransactionalInterceptor只会被创建一次if (globalTransactionalInterceptor == null) {globalTransactionalInterceptor =new GlobalTransactionalInterceptor(failureHandlerHook);ConfigurationCache.addConfigListener(ConfigurationKeys.DISABLE_GLOBAL_TRANSACTION,(ConfigurationChangeListener) globalTransactionalInterceptor);}interceptor = globalTransactionalInterceptor;}}if (!AopUtils.isAopProxy(bean)) {// 如果bean本身不是Proxy对象,则直接调用父类的wrapIfNecessary生成代理对象即可// 在父类中会调用getAdvicesAndAdvisorsForBean获取到上面定义的interceptorbean = super.wrapIfNecessary(bean, beanName, cacheKey);} else {// 如果该bean已经是代理对象了,则直接在代理对象的拦截调用链AdvisedSupport// 上直接添加新的interceptor即可。AdvisedSupport advised = SpringProxyUtils.getAdvisedSupport(bean);Advisor[] advisor = buildAdvisors(beanName,getAdvicesAndAdvisorsForBean(null, null, null));for (Advisor avr : advisor) {advised.addAdvisor(0, avr);}} // 标识该beanName已经处理过了PROXYED_SET.add(beanName);return bean;}} catch (Exception exx) {throw new RuntimeException(exx);}}// 返回wrapIfNecessary方法中计算出的interceptor对象@Overrideprotected Object[] getAdvicesAndAdvisorsForBean(Class beanClass, String beanName,TargetSource customTargetSource)throws BeansException {return new Object[]{interceptor};}
}
上面介绍了GlobalTransactionScanner是如何通过注解拦截全局事务的,具体拦截器实现为TccActionInterceptor和GlobalTransactionalInterceptor,对于AT模式来说我们主要关心GlobalTransactionalInterceptor,在后续的文章中会介绍GlobalTransactionalInterceptor的具体实现。
另外GloabalTransactionScanner还负责TM、RM的初始化工作,是在initClient方法中实现的:
private void initClient() {...//初始化TMTMClient.init(applicationId, txServiceGroup);...//初始化RMRMClient.init(applicationId, txServiceGroup);...// 注册Spring shutdown的回调,用来释放资源registerSpringShutdownHook();}
TMClient、RMClient都是Seata基于Netty实现的Rpc框架的客户端类,只是业务逻辑不同,由于TMClient相对来说更简单一些,我们以RMClient为例看一下源码:
public class RMClient {// RMClient的init是一个static方法,创建了一个RmNettyRemotingClient实例,并调用init方法public static void init(String applicationId, String transactionServiceGroup) {RmNettyRemotingClient rmNettyRemotingClient =RmNettyRemotingClient.getInstance(applicationId, transactionServiceGroup);rmNettyRemotingClient.setResourceManager(DefaultResourceManager.get());rmNettyRemotingClient.setTransactionMessageHandler(DefaultRMHandler.get());rmNettyRemotingClient.init();}
}
RmNettyRemotingClient的实现如下:
@Sharable
public final class RmNettyRemotingClient extends AbstractNettyRemotingClient {// ResourceManager负责处理事务参与方,支持AT、TCC、Saga三种模式private ResourceManager resourceManager;// RmNettyRemotingClient单例private static volatile RmNettyRemotingClient instance;private final AtomicBoolean initialized = new AtomicBoolean(false);// 微服务的唯一标识private String applicationId;// 分布式事务分组名称private String transactionServiceGroup;// RMClient中init方法会调用该init方法public void init() {// 注册Seata自定义Rpc的ProcessorregisterProcessor();if (initialized.compareAndSet(false, true)) {// 调用父类的init方法,在父类中负责Netty的初始化,与Seata-Server建立连接super.init();}}// 注册Seata自定义Rpc的Processorprivate void registerProcessor() {// 1.注册Seata-Server发起branchCommit的处理ProcessorRmBranchCommitProcessor rmBranchCommitProcessor =new RmBranchCommitProcessor(getTransactionMessageHandler(), this);super.registerProcessor(MessageType.TYPE_BRANCH_COMMIT, rmBranchCommitProcessor,messageExecutor);// 2.注册Seata-Server发起branchRollback的处理ProcessorRmBranchRollbackProcessor rmBranchRollbackProcessor =new RmBranchRollbackProcessor(getTransactionMessageHandler(), this);super.registerProcessor(MessageType.TYPE_BRANCH_ROLLBACK, rmBranchRollbackProcessor, messageExecutor);// 3.注册Seata-Server发起删除undoLog的处理ProcessorRmUndoLogProcessor rmUndoLogProcessor =new RmUndoLogProcessor(getTransactionMessageHandler());super.registerProcessor(MessageType.TYPE_RM_DELETE_UNDOLOG, rmUndoLogProcessor,messageExecutor);// 4.注册Seata-Server返回Response的处理Processor,ClientOnResponseProcessor// 用于处理由Client主动发起Request,Seata-Server返回的Response。// ClientOnResponseProcessor负责把Client发送的Request和Seata-Server// 返回的Response对应起来,从而实现RpcClientOnResponseProcessor onResponseProcessor =new ClientOnResponseProcessor(mergeMsgMap, super.getFutures(),getTransactionMessageHandler());super.registerProcessor(MessageType.TYPE_SEATA_MERGE_RESULT, onResponseProcessor,null);super.registerProcessor(MessageType.TYPE_BRANCH_REGISTER_RESULT,onResponseProcessor, null);super.registerProcessor(MessageType.TYPE_BRANCH_STATUS_REPORT_RESULT,onResponseProcessor, null);super.registerProcessor(MessageType.TYPE_GLOBAL_LOCK_QUERY_RESULT,onResponseProcessor, null);super.registerProcessor(MessageType.TYPE_REG_RM_RESULT, onResponseProcessor, null);// 5. 处理Seata-Server返回的Pong消息ClientHeartbeatProcessor clientHeartbeatProcessor = new ClientHeartbeatProcessor();super.registerProcessor(MessageType.TYPE_HEARTBEAT_MSG, clientHeartbeatProcessor,null);}
}
上面的逻辑看起来比较复杂,相关类也比较多,如:各种Processor、各种MessageType、TransactionMessageHandler、ResourceManager。其实本质上就是Rpc调用,分为Rm主动调用和Seata主动调用。
- Rm主动调用方法: 如:注册分支、汇报分支状态、申请全局锁等。Rm主动调用的方法都需要在ClientOnResponseProcessor中处理Seata-Server返回的Response
- Seata-Server主动调用方法: 如:提交分支事务、回滚分支事务、删除undolog日志。Seata-Server主动调用的方法,Client端分别对应不同的Processor来处理,并且处理结束后要返回给Seata-Server处理结果Response。而事务提交、回滚的核心实现逻辑都在TransactionMessageHandler、ResourceManager中。
关于TransactionMessageHandler、ResourceManager的具体实现也会在后续的章节中详细描述。
下一篇会介绍一下SeataAutoDataSourceProxyCreator、Rpc Interceptor是如何初始化以及拦截的。
原文:https://seata.io/zh-cn/blog/seata-sourcecode-client-bootstrap.html
●史上最强Tomcat8性能优化
●阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路
●B2B电商平台--ChinaPay银联电子支付功能
●学会Zookeeper分布式锁,让面试官对你刮目相看
●SpringCloud电商秒杀微服务-Redisson分布式锁方案
查看更多好文,进入公众号--撩我--往期精彩
一只 有深度 有灵魂 的公众号0.0
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- $refs,$el,$data,$options区别及用法
1.$refs 作用跟jq的获取dom元素$一样 有三种用法: 1.ref加在普通的元素上,用this.$refs.(ref值)获取到的是dom元素 2.ref加在子组件上,用this.$refs.(ref值)获取到的是组件实例,可以使用组件的所有方法。在使用方法的时候直接thi…...
2024/5/1 5:55:36 - ORAN专题系列-21:5G协议栈功能切分选项与O-RAN白盒化
白盒化小基站经常提到Option6,7,8, 为啥没有Opiton1-5呢? 从下图就可以看出原因。 选项1-8是5G协议栈的功能切分点。 O-RAN分离式基站,只使用了Option6-8,也就是说,在O-RAN中,最多把High-PHY放到O-RU中实现…...
2024/4/26 11:01:29 - application.yml 增加日志设置
logging:level:com:csdn: debug...
2024/4/26 2:12:33 - 华三交换机V5和V7版本设置telnet登录配置
华三交换机V5和V7版本设置telnet登录配置 V5版本命令 telnet server enable user-interface vty 0 4 authentication-mode scheme local-user admin password simple admin123 authorization-attribute level 3 service-type telnet V7版本命令 telnet server enable user-int…...
2024/4/24 19:06:30 - Unity 开发Webgl的辛酸史(1)
最近在开发一个webgl的项目,因为是第一次做这种项目,遇到了一些问题,在网上找了好久才找到解决办法。为了让大家以后少踩点坑,我把我遇到的问题分享一下。 1,首先是打包webgl之后,运行不显示文字࿰…...
2024/4/25 9:14:05 - 105. 从前序与中序遍历序列构造二叉树
题目描述: 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7 …...
2024/4/24 23:00:15 - 面试基础问题整理(二)
请说一下你对JDK, JRE, JVM的理解 JVM是Java的虚拟机; 作用: 实现了Java语言的跨平台JRE是Java的运行环境, 包含JVM和Java开发工具; 作用: 开发Java程序JDK 是Java的开发工具包, 包含JRE和Java开发工具; 作用:开发java程序 请简述什么是关键字, 关键字的特点, 请列举5个插件的关…...
2024/4/7 14:28:23 - 洛谷P3386 [模板]二分图最大匹配(网络最大流)
题目链接 题目描述 给定一个二分图,其左部点的个数为 n,右部点的个数为 m,边数为 e,求其最大匹配的边数。 左部点从 1 至 n 编号,右部点从 1 至 m 编号。 输入格式 输入的第一行是三个整数,分别代表 n…...
2024/4/29 15:48:39 - 应用案例 | 2010 款吉利美日车热机时发动机加速无力故障诊断
一、故障现象 一辆2010款吉利美日车,搭载JL4G18发动机,累计行驶里程约为10万km。车主反映,冷机时起动发动机,车辆工作一切正常,但车辆行驶约20 km后,会出现发动机加速无力的现象,且匀速行驶时…...
2024/4/26 10:15:53 - SpringBoot 指定任意Core,实现Solr全量更新
话不多说,直接上代码块。… Value("${spring.data.solr.host}") private String dataSolr;private static String dataBaseSolr;/*** 手动更新增量或者全量操作操作** param delta*/ public static void deltaQuery(String collection, Boolean delta) {…...
2024/4/7 1:40:25 - 13.5k点赞的SpringBoot快速开发脚手架附详细教程
说明:项目地址和技术文档获取方式在文末。 今天推荐的一个 Spring Boot 快速开发脚手架是 pig,一个在码云上斩获了 13.5k star 的新星项目。 这个项目因为其方便易用、功能齐全,社区活跃,受到了很多 Java 开发者的喜爱࿰…...
2024/4/27 18:50:12 - Git 和 github 的使用 (windows环境)
一. windows环境下安装Git 从Git官网上直接下载,默认选项安装 查看git是否安装成功 $ git --version二. 创建一个本地仓库 1.首先创建一个空目录,路径和名称自己选择 $ mkdir test $ cd test注:test为新建的仓库名称 2.接下来,初始化仓…...
2024/4/7 2:06:00 - DS 0910(第四章 串)
串 def:串,即字符串,是由零个或多个字符组成的有限序列,一般记为S‘a1a2.。。。an’ 其中,S是串名,单引号括起来的字符序列是串的值,an可以是字母,数字或其他字符,串中…...
2024/4/7 3:17:34 - Vue -- 目录
[Vue.js] 基础 [Vue.js] 基础 – 安装Vue[Vue.js] 基础 – Vue简介[Vue.js] 基础 – Vue实例[Vue.js] 基础 – 模板语法...
2024/4/30 11:25:43 - ZOJ1904 详解
一、题目 砍树时,海狸从树干上切出非常特殊的形状。树干上剩下的东西看起来像是两个圆锥体的圆锥台,圆锥体由直径与其高度相同的圆柱体相连。一个非常好奇的海狸不试图毁坏一棵树,而是想弄清楚连接平截头体的圆柱体的直径应该是多少…...
2024/4/29 12:34:55 - PADS 拉选嵌在元器件封装里面的文字
问题描述如下 如果其中的元器件编号也就是丝印,放在元器件里边,对后面会有一点影响,想要直接点它拉出来是不行的,因为好像根本选不中,要么选中元器件,要么选中里面的焊盘。 解决办法 右击旁边空白&#x…...
2024/4/24 16:51:58 - HBase 之三 HBase 的读写流程
前言 上一篇详细讲述了 HBase 的数据模型以及组织架构,这一篇就来讲讲 HBase 的读写流程,由于其依托于 Zookeeper 与 HDFS 因此其读写流程较为复杂,推荐先阅读HBase的数据模型与架构熟悉 HBase 的组织架构,然后再阅读本文会有…...
2024/4/17 12:23:45 - 实现可拖拽移动的悬浮按钮(FBA按钮)
实现可拖拽移动的悬浮按钮 不论在什么场景,最重要的是监听按钮的移动距离 以vue为例,如下: <template><div><div v-show"isShow" class"back-btn" click.stop"goback" ref"backDom&quo…...
2024/4/7 4:35:54 - 13:观察者设计模式在多线程中的运用
1.观察者设计模式 简单来说,观察者模式发布者订阅者。典型的例子:猎头和寻找工作的人。找工作的人向猎头订阅,告知自己希望得到一份工作,当有新的工作机会的时候,猎头就会把这个信息通知给曾经向他订阅过的人。 2.多…...
2024/4/21 17:45:35 - 论文:Deep Learning in Medical Image Registration: A Survey
这是一篇综述论文,我按照文章原本的章节顺序进行了重点摘抄。我最近才开始看这方面的文章,难免有不到位的地方,若有问题还请不吝赐教。 一、 基于深度相似度的配准 (一)单模态配准 (1)堆栈自编码…...
2024/4/7 0:38:04
最新文章
- Stability AI 推出稳定音频 2.0:为创作者提供先进的 AI 生成音频
概述 Stability AI 的发布再次突破了创新的界限。这一尖端模型以其前身的成功为基础,引入了一系列突破性的功能,有望彻底改变艺术家和音乐家创建和操作音频内容的方式。 Stable Audio 2.0 代表了人工智能生成音频发展的一个重要里程碑,为质量…...
2024/5/1 9:07:43 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 自定义OPPO-r9s的kernel内核,并开启安卓支持docker
0. 版本说明 本文提供了OPPO手机r9s的内核编译方法,并开机支持docker。用的是开源lineage14.1的rom。 我这边基于开源lineage14.1,打了一个docker内核编译镜像(17380582683/r9s),大家可以在容器里,手动打出完整的rom包zip文件。…...
2024/4/30 5:06:51 - K8S容器空间不足问题分析和解决
如上图,今天测试环境的K8S平台出现了一个问题,其中的一个容器报错:Free disk space below threshold. Available: 3223552 bytes (threshold: 10485760B),意思服务器硬盘空间不够了。这个问题怎么产生的,又怎么解决的呢…...
2024/4/30 17:15:32 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/4/30 9:36:27 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/4/30 0:57:52 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/4/29 18:43:42 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/1 4:07:45 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/4/30 23:32:22 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/4/30 23:16:16 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/5/1 6:35:25 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/4/29 21:25:29 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/1 4:35:02 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/4/30 14:53:47 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/4/30 22:14:26 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/5/1 6:34:45 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/4/30 22:57:18 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/4/30 20:39:53 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/5/1 4:45:02 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/5/1 8:32:56 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/4/29 3:42:58 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/4/29 19:56:39 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/5/1 5:23:20 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/4/30 20:52:33 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57