使用BeanDefinition来构建Spring Bean并注入Spring上下文中

在做中间件产品的时候,为了给业务方一个好用的客户端,我们一般会提供一个自定义的xxx-spring-boot-starter,那么我们就可能涉及到将自己的客户端中的某个类初始化并注入到Spring上下文中去。为了更标准化去初始化这个类,让Spring来管理我们这个对象的生命周期,那么我们经常会使用BeanDefinition来定义并通过自定义的xxxFactoryBean来真正初始化我们的对象。

先看下使用示例:

private void resolveRegistryClientBeanDefinition(BeanDefinitionRegistry registry, DispatchProperty dispatchProperty) {String beanName = Client.class.getName();ClientBeanDefinitionBuilder beanDefinitionBuilder = new ClientBeanDefinitionBuilder();beanDefinitionBuilder.property(dispatchProperty);BeanDefinition beanDefinition = beanDefinitionBuilder.build();if (!context.containsBean(beanName)) {registry.registerBeanDefinition(beanName, beanDefinition);LOGGER.info("NBP-CLIENT-STARTER", "registered beanDefinition of {} in spring context.", beanName);} else {LOGGER.warn("NBP-CLIENT-STARTER", "beanDefinition of {} has already registered in spring context.", beanName);}}

以上,我们使用ClientBeanDefinitionBuilder来定义如何构建ClientFactoryBean,然后通过ClientFactoryBean来创建Client对象,并通过registry.registerBeanDefinition(beanName, beanDefinition); 来将其注入到Spring上下文中去。

我们再来看下ClientBeanDefinitionBuilder和ClientFactoryBean里面是如何实现的。

ClientBeanDefinitionBuilder

package com.xxx.arch.mw.nbp.client.spring;import com.xxx.arch.mw.nbp.client.configuration.DispatchProperty;
import com.xxx.arch.mw.nbp.client.constant.ClientConstants;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;/*** @created 2022-11-30 3:08 PM* @description:*/
public class ClientBeanDefinitionBuilder {private DispatchProperty property;ClientBeanDefinitionBuilder() {}ClientBeanDefinitionBuilder property(DispatchProperty property) {this.property = property;return this;}BeanDefinition build() {BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(ClientFactoryBean.class);builder.addPropertyValue("property", this.property);builder.addPropertyReference("publisher", ClientConstants.NBP_PUBLISHER_IMPL_BEAN_NAME);builder.addPropertyReference("subscriber", ClientConstants.NBP_SUBSCRIBER_IMPL_BEAN_NAME);builder.addDependsOn(ClientConstants.NBP_PUBLISHER_IMPL_BEAN_NAME);builder.addDependsOn(ClientConstants.NBP_SUBSCRIBER_IMPL_BEAN_NAME);builder.setInitMethodName(ClientConstants.INIT_METHOD);return builder.getBeanDefinition();}}

ClientFactoryBean

package com.xxx.arch.mw.nbp.client.spring;import com.xxx.arch.mw.nbp.client.Client;
import com.xxx.arch.mw.nbp.client.DefaultClient;
import com.xxx.arch.mw.nbp.client.configuration.DispatchProperty;
import com.xxx.arch.mw.nbp.client.publish.Publisher;
import com.xxx.arch.mw.nbp.client.subscribe.Subscriber;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;/*** @created 2022-11-30 3:32 PM* @description:*/
public class ClientFactoryBean implements FactoryBean<Object>, EnvironmentAware, InitializingBean {private ConfigurableEnvironment environment;private DispatchProperty property;private Client client;private Publisher publisher;private Subscriber subscriber;public ClientFactoryBean() {}@Overridepublic Object getObject() throws Exception {return client;}public void start() throws Exception {if (client == null) {client = new DefaultClient(this.property);if (publisher != null) {((DefaultClient) client).setPublisher(publisher);}if (subscriber != null) {((DefaultClient) client).setSubscriber(subscriber);}}}@Overridepublic void afterPropertiesSet() throws Exception {}@Overridepublic Class<?> getObjectType() {return Client.class;}@Overridepublic void setEnvironment(Environment environment) {this.environment = (ConfigurableEnvironment) environment;}@Overridepublic boolean isSingleton() {return true;}public DispatchProperty getProperty() {return property;}public void setProperty(DispatchProperty property) {this.property = property;}public Publisher getPublisher() {return publisher;}public void setPublisher(Publisher publisher) {this.publisher = publisher;}public Subscriber getSubscriber() {return subscriber;}public void setSubscriber(Subscriber subscriber) {this.subscriber = subscriber;}
}

我们看到Client内部还分别依赖了Publisher和Subscriber,此实现也类似,详见如下:

如何构建Publisher

 private void resolveRegistryPublisherImplBeanDefinition(ConfigurableListableBeanFactory beanFactory,BeanDefinitionRegistry registry,DispatchProperty dispatchProperty) {String beanName = ClientConstants.NBP_PUBLISHER_IMPL_BEAN_NAME;// 额外增加主子任务需要发布者订阅的模板PUBLISHER_TEMPLATE_SET.addAll(MAPREDUCE_PUBLISHER_TEMPLATE_SET);BeanDefinition beanDefinition = new PublisherBeanDefinitionBuilder().property(dispatchProperty).beanFactory(beanFactory).templates(PUBLISHER_TEMPLATE_SET).filters(CUSTOM_PUBLISH_FILTER_SET).build();if (!context.containsBean(beanName)) {registry.registerBeanDefinition(beanName, beanDefinition);LOGGER.info("NBP-CLIENT-STARTER","registered beanDefinition of {} in spring context.", beanName);} else {LOGGER.warn("NBP-CLIENT-STARTER","beanDefinition of {} has already registered in spring context.", beanName);}}

PublisherBeanDefinitionBuilder

package com.xxx.arch.mw.nbp.client.spring;import com.xxx.arch.mw.nbp.client.configuration.DispatchProperty;
import com.xxx.arch.mw.nbp.client.constant.ClientConstants;
import com.xxx.arch.mw.nbp.common.domain.Template;
import com.xxx.commons.data.domain.tuple.Pair;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;/*** @created 2022-11-30 3:08 PM* @description:*/
public class PublisherBeanDefinitionBuilder {private DispatchProperty property;/***  依赖的bean名称列表*/private List<String> dependsOns = new ArrayList<>();/*** 发布的任务模板列表*/private Set<Template> templates = new HashSet<>();/***  发布者的自定义过滤器列表*  Pair格式: (filterBeanName, filterClass)*/private Set<Pair<String, Class<?>>> filters = new HashSet<>();private ConfigurableListableBeanFactory beanFactory;PublisherBeanDefinitionBuilder() {}PublisherBeanDefinitionBuilder property(DispatchProperty property) {this.property = property;return this;}PublisherBeanDefinitionBuilder templates(Set<Template> templates) {if (templates != null) {this.templates = templates;}return this;}PublisherBeanDefinitionBuilder template(Template template) {if (template == null) {return this;}if (this.templates == null) {this.templates = new HashSet<>();}this.templates.add(template);return this;}PublisherBeanDefinitionBuilder filters(Set<Pair<String, Class<?>>> filters) {if (filters != null) {this.filters = filters;}return this;}PublisherBeanDefinitionBuilder beanFactory(ConfigurableListableBeanFactory beanFactory) {this.beanFactory = beanFactory;return this;}PublisherBeanDefinitionBuilder filter(Pair<String, Class<?>> filter) {if (filter == null) {return this;}if (this.filters == null) {this.filters = new HashSet<>();}this.filters.add(filter);return this;}PublisherBeanDefinitionBuilder dependsOns(List<String> dependsOns) {if (dependsOns != null) {this.dependsOns = dependsOns;}return this;}PublisherBeanDefinitionBuilder dependsOn(String dependsOn) {if (dependsOn == null) {return this;}if (this.dependsOns != null) {this.dependsOns = new ArrayList<>();}this.dependsOns.add(dependsOn);return this;}BeanDefinition build() {BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(PublisherFactoryBean.class);builder.addPropertyValue("property", this.property);builder.addPropertyValue("templates", this.templates);builder.addPropertyValue("filters", this.filters);builder.addPropertyValue("beanFactory", this.beanFactory);builder.setInitMethodName(ClientConstants.INIT_METHOD);for (String dependsOn : dependsOns) {builder.addDependsOn(dependsOn);}return builder.getBeanDefinition();}}

PublisherFactoryBean

package com.xxx.arch.mw.nbp.client.spring;import com.xxx.arch.mw.nbp.client.PublisherImpl;
import com.xxx.arch.mw.nbp.client.configuration.DispatchProperty;
import com.xxx.arch.mw.nbp.client.publish.Publisher;
import com.xxx.arch.mw.nbp.common.domain.Template;
import com.xxx.arch.mw.nbp.common.extension.Filter;
import com.xxx.commons.data.domain.tuple.Pair;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;import java.util.HashSet;
import java.util.Set;/*** @created 2022-11-30 3:32 PM* @description:*/
public class PublisherFactoryBean implements FactoryBean<Object>, EnvironmentAware, InitializingBean {private ConfigurableEnvironment environment;private DispatchProperty property;private Set<Template> templates = new HashSet<>();private Set<Pair<String, Class<?>>> filters = new HashSet<>();private ConfigurableListableBeanFactory beanFactory;private Publisher publisher;public PublisherFactoryBean() {}@Overridepublic Object getObject() throws Exception {return publisher;}public void start() throws Exception {if (publisher == null) {publisher = new PublisherImpl(this.property);for (Template template : templates) {publisher.register(template.getTemplateCode());}for (Pair<String, Class<?>> filterPair : filters) {Object filter = filterPair.getRight().getAnnotation(Component.class) != null ?beanFactory.getBean(filterPair.getLeft(), filterPair.getRight()) :filterPair.getRight().getDeclaredConstructor().newInstance();publisher.addFilter((Filter) filter);}}publisher.start();}@Overridepublic void afterPropertiesSet() throws Exception {}@Overridepublic Class<?> getObjectType() {return PublisherImpl.class;}@Overridepublic void setEnvironment(Environment environment) {this.environment = (ConfigurableEnvironment) environment;}@Overridepublic boolean isSingleton() {return true;}public DispatchProperty getProperty() {return property;}public void setProperty(DispatchProperty property) {this.property = property;}public Set<Template> getTemplates() {return templates;}public void setTemplates(Set<Template> templates) {this.templates = templates;}public Set<Pair<String, Class<?>>> getFilters() {return filters;}public void setFilters(Set<Pair<String, Class<?>>> filters) {this.filters = filters;}public ConfigurableListableBeanFactory getBeanFactory() {return beanFactory;}public void setBeanFactory(ConfigurableListableBeanFactory beanFactory) {this.beanFactory = beanFactory;}
}

如何构建Subscriber

private void resolveRegistrySubscriberImplBeanDefinition(ConfigurableListableBeanFactory beanFactory,BeanDefinitionRegistry registry,DispatchProperty dispatchProperty) {String beanName = ClientConstants.NBP_SUBSCRIBER_IMPL_BEAN_NAME;BeanDefinition beanDefinition = new SubscriberBeanDefinitionBuilder().beanFactory(beanFactory).property(dispatchProperty).filters(CUSTOM_EXECUTE_FILTER_SET).listeners(DISPATCH_LISTENER_MAP).build();if (!context.containsBean(beanName)) {registry.registerBeanDefinition(beanName, beanDefinition);LOGGER.info("NBP-CLIENT-STARTER", "registered beanDefinition of {} in spring context.", beanName);} else {LOGGER.warn("NBP-CLIENT-STARTER", "beanDefinition of {} has already registered in spring context.", beanName);}}

SubscriberBeanDefinitionBuilder

package com.xxx.arch.mw.nbp.client.spring;import com.xxx.arch.mw.nbp.client.configuration.DispatchProperty;
import com.xxx.arch.mw.nbp.client.constant.ClientConstants;
import com.xxx.arch.mw.nbp.client.remoting.Discover;
import com.xxx.commons.data.domain.tuple.Pair;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;/*** @created 2022-11-30 3:08 PM* @description:*/
public class SubscriberBeanDefinitionBuilder {private DispatchProperty property;/*** 执行者的自定义过滤器列表* Pair格式: (filterBeanName, filterClass)*/private Set<Pair<String, Class<?>>> filters = new HashSet<>();/*** 监听器列表* Map格式: (templateCode, (listenerBeanName, listenerClass))*/private Map<String, Pair<String, Class<?>>> listeners = new HashMap<>();private ConfigurableListableBeanFactory beanFactory;SubscriberBeanDefinitionBuilder() {}SubscriberBeanDefinitionBuilder property(DispatchProperty property) {this.property = property;return this;}SubscriberBeanDefinitionBuilder filters(Set<Pair<String, Class<?>>> filters) {if (filters != null) {this.filters = filters;}return this;}SubscriberBeanDefinitionBuilder filter(Pair<String, Class<?>> filter) {if (filter == null) {return this;}if (this.filters == null) {this.filters = new HashSet<>();}this.filters.add(filter);return this;}SubscriberBeanDefinitionBuilder listeners(Map<String, Pair<String, Class<?>>> listeners) {if (listeners != null) {this.listeners = listeners;}return this;}SubscriberBeanDefinitionBuilder listener(String templateCode, Pair<String, Class<?>> listener) {if (templateCode == null) {return this;}if (listener == null) {return this;}if (this.listeners == null) {this.listeners = new HashMap<>();}this.listeners.put(templateCode, listener);return this;}SubscriberBeanDefinitionBuilder beanFactory(ConfigurableListableBeanFactory beanFactory) {this.beanFactory = beanFactory;return this;}BeanDefinition build() {BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(SubscriberFactoryBean.class);builder.addPropertyValue("property", this.property);builder.addPropertyValue("filters", this.filters);builder.addPropertyValue("beanFactory", this.beanFactory);builder.addPropertyValue("listeners", this.listeners);builder.addPropertyReference("publisher", ClientConstants.NBP_PUBLISHER_IMPL_BEAN_NAME);builder.addDependsOn(ClientConstants.NBP_PUBLISHER_IMPL_BEAN_NAME);for (Pair<String, Class<?>> filterPair : this.filters) {if (filterPair.getRight().getAnnotation(Component.class) == null) {continue;}builder.addDependsOn(filterPair.getLeft());}for (Map.Entry<String, Pair<String, Class<?>>> entry : this.listeners.entrySet()) {if (Discover.IGNORED_TEMPLATE_CODE.equals(entry.getKey())) {continue;}builder.addDependsOn(entry.getValue().getLeft());}builder.setInitMethodName(ClientConstants.INIT_METHOD);return builder.getBeanDefinition();}}

SubscriberFactoryBean

package com.xxx.arch.mw.nbp.client.spring;import com.xxx.arch.mw.nbp.client.PublisherImpl;
import com.xxx.arch.mw.nbp.client.SubscriberImpl;
import com.xxx.arch.mw.nbp.client.configuration.DispatchProperty;
import com.xxx.arch.mw.nbp.client.publish.Publisher;
import com.xxx.arch.mw.nbp.client.remoting.Discover;
import com.xxx.arch.mw.nbp.client.subscribe.Subscriber;
import com.xxx.arch.mw.nbp.common.domain.Listener;
import com.xxx.arch.mw.nbp.common.extension.Filter;
import com.xxx.commons.data.domain.tuple.Pair;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;/*** @created 2022-11-30 3:32 PM* @description:*/
public class SubscriberFactoryBean implements FactoryBean<Object>, EnvironmentAware, InitializingBean {private ConfigurableEnvironment environment;private DispatchProperty property;private Set<Pair<String, Class<?>>> filters = new HashSet<>();private Map<String, Pair<String, Class>> listeners = new HashMap<>();private ConfigurableListableBeanFactory beanFactory;private Subscriber subscriber;private Publisher publisher;public SubscriberFactoryBean() {}@Overridepublic Object getObject() throws Exception {return subscriber;}public void start() throws Exception {if (subscriber == null) {subscriber = new SubscriberImpl(this.property, publisher);for (Pair<String, Class<?>> filterPair : filters) {Object filter = filterPair.getRight().getAnnotation(Component.class) != null ?beanFactory.getBean(filterPair.getLeft(), filterPair.getRight()) :filterPair.getRight().getDeclaredConstructor().newInstance();subscriber.addFilter((Filter) filter);}for (Map.Entry<String, Pair<String, Class>> entry : this.listeners.entrySet()) {if (Discover.IGNORED_TEMPLATE_CODE.equals(entry.getKey())) {continue;}subscriber.subscribe(entry.getKey(), (Listener) beanFactory.getBean(entry.getValue().getLeft(), entry.getValue().getRight()));}}subscriber.start();}@Overridepublic void afterPropertiesSet() throws Exception {}@Overridepublic Class<?> getObjectType() {return PublisherImpl.class;}@Overridepublic void setEnvironment(Environment environment) {this.environment = (ConfigurableEnvironment) environment;}@Overridepublic boolean isSingleton() {return true;}public DispatchProperty getProperty() {return property;}public void setProperty(DispatchProperty property) {this.property = property;}public Publisher getPublisher() {return publisher;}public void setPublisher(Publisher publisher) {this.publisher = publisher;}public Set<Pair<String, Class<?>>> getFilters() {return filters;}public void setFilters(Set<Pair<String, Class<?>>> filters) {this.filters = filters;}public Map<String, Pair<String, Class>> getListeners() {return listeners;}public void setListeners(Map<String, Pair<String, Class>> listeners) {this.listeners = listeners;}public ConfigurableListableBeanFactory getBeanFactory() {return beanFactory;}public void setBeanFactory(ConfigurableListableBeanFactory beanFactory) {this.beanFactory = beanFactory;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows10系统下CGAL的安装编译

文章目录 环境与依赖库1、环境2、依赖库Boost库安装步骤Qt安装步骤CGAL5.6安装步骤CGAL5.6编译环境与依赖库 1、环境 Windows10系统Visual Studio 20222、依赖库 Boost库版本:1.73Qt库版本:5.12CGAL版本:5.6Boost库安装步骤 boost是CGAL的强制依赖库。 1、下载boost_1_73…

ubuntu22.04搭建RTSP服务器

大致命令如下&#xff1a; git clone --depth 1 gitgithub.com:ZLMediaKit/ZLMediaKit.git sudo apt-get install build-essential sudo apt-get install cmake #除了openssl,其他其实都可以不安装 sudo apt-get install libssl-dev sudo apt-get install libsdl-dev sudo apt…

无法获取前置摄像头的预览图像?【Bug已解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结HarmonyOS和OpenHarmony区别和联系项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了无法获取前置摄像头的预览图像的问题。 问题:前置摄像头…

(一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。

本文简单介绍一下ClickHouse 中的 MaterializedMySQL 数据库引擎的使用方法、设置、特性和限制。以下是具体的内容和步骤&#xff1a; 介绍和使用说明: MaterializedMySQL 是一个实验性的数据库引擎。它允许创建一个 ClickHouse 数据库&#xff0c;其中包含了 MySQL 中的所有表…

linux基于用户身份对资源访问进行控制的解析及过程

linux中用户分为三类 1.超级用户&#xff08;root&#xff09; 拥有至高无上的权限 2.普通用户 人为创建、权限小&#xff0c;权限受到控制 3.程序用户 运行程序的用户&#xff0c;不是给人使用的&#xff0c;给程序使用的&#xff0c;一般不给登录&#xff01; 组账…

【LeetCode刷题笔记(13-1)】【Python】【回文数】【反转整数】【简单】

文章目录 引言回文数题目描述提示 题意分析解决方案1&#xff1a;【反转字符串】解决方案2&#xff1a;【反转整数】题外话结束语 9. 回文数 引言 编写通过所有测试案例的代码并不简单&#xff0c;通常需要深思熟虑和理性分析。虽然这些代码能够通过所有的测试案例&#xff0…

【AI】人工智能爆发推进器之卷积神经网络

目录 一、什么是卷积神经网络 1. 卷积层&#xff08;Convolutional Layer&#xff09; 2. 激活函数&#xff08;Activation Function&#xff09; 3. 池化层&#xff08;Pooling Layer&#xff09; 4. 全连接层&#xff08;Fully Connected Layer&#xff09; 5. 训练过程…

html table+css实现可编辑表格

要实现可编辑的 HTML 表格&#xff0c;你可以使用 JavaScript 和 HTML5 的 contenteditable 属性。 <!DOCTYPE html> <html> <head><style>table {border-collapse: collapse;width: 100%;}th, td {border: 1px solid black;padding: 8px;text-align:…

区块链白皮书:基础建设见成效,国产自主生态正发展壮大

“区块链是全球信任机器的重要组成部分”——比尔盖茨 随着科技的飞速发展&#xff0c;区块链技术已成为引领全球创新的重要力量。近日&#xff0c;中国信通院发布了《区块链白皮书&#xff08;2023年&#xff09;》&#xff0c;为我们揭示了这一领域的前沿动态和未来发展趋势…

JDK 14全景透视:每个Java开发者必知的新特性

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 JDK 14全景透视&#xff1a;每个Java开发者必知的新特性 前言&#xff1a;switch表达式标准化Switch表达式成为正式特性的意义&#xff1a;如何使用Switch表达式&#xff1a;注意事项&#xff1a; ins…

docker安装Nacos和Rabbitmq

一、安装Nacos 首先需要拉取对应的镜像文件&#xff1a;&#xff08;切换版本加上对应版本号即可&#xff0c;默认最新版&#xff09; docker pull nacos/nacos-server 接着挂载目录&#xff1a; mkdir -p /mydata/nacos/logs/ #新建logs目录 mkdir -p …

第九部分 图论

目录 例 相关概念 握手定理 例1 图的度数列 例 无向图的连通性 无向图的连通度 例2 例3 有向图D如图所示&#xff0c;求 A, A2, A3, A4&#xff0c;并回答诸问题&#xff1a; 中间有几章这里没有写&#xff0c;感兴趣可以自己去学&#xff0c;组合数学跟高中差不多&#xff0c…

ElasticSearch 常用运维命令收集

ElasticSearch 常用运维命令收集 1. 集群健康检查 快速查看 curl -XGET localhost:9200/_cat/health?v&pretty集群的健康状态status&#xff0c;还可以了解到集群当前有多少节点number_of_nodes&#xff0c;多少个数据节点number_of_data_nodes&#xff0c;有多少个主分片…

mp4视频转rosbag文件(图片压缩、画面旋转、时间戳调整)

目录 目的 环境 主要步骤 创建py文件 执行py文件 效果 程序解释 画面旋转 时间戳调整 目的 将相机录制的mp4格式文件&#xff0c;转为ROS系统能使用的bag格式文件。 如果相机的画面不是正视的&#xff0c;会影响后续使用&#xff0c;需要旋转调整。 环境 安装有ROS…

亚马逊云科技 re:Invent 大会 - ElastiCache Serverless 模式来袭

大会介绍 亚马逊云科技的 re:Invent 大会是一年一度的&#xff0c;面向全球技术开发者科技盛会。几乎每次都会发布云科技、云计算等相关领域的产品重磅更新&#xff0c;不但将时下主流热门的技术不断整合&#xff0c;也未将来的发展标明了方向。 亚马逊云科技开发者社区为开发…

处理go中clientv3连接etcd包异常

目录 1、创建任意项目 2、出现异常 3、处理异常 1、创建任意项目 go mod init go-test 项目代码内容: package main//go.etcd.io/etcd/clientv3重点处理这个包 import ("context""fmt""go.etcd.io/etcd/clientv3""log""ti…

【滑动窗口】【map】LeetCode:76最小覆盖子串

作者推荐 【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值 本文涉及知识点 滑动窗口 题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对…

根据DCT特征训练CNN

记录一次改代码的挣扎经历&#xff1a; 看了几篇关于DCT频域的深度模型文献&#xff0c;尤其是21年FcaNet&#xff1a;基于DCT 的attention model&#xff0c;咱就是说想试试将我模型的输入改为分组的DCT系数&#xff0c;然后就开始下面的波折了。 第一次尝试&#xf…

深入解析 Flink CDC 增量快照读取机制

一、Flink-CDC 1.x 痛点 Flink CDC 1.x 使用 Debezium 引擎集成来实现数据采集&#xff0c;支持全量加增量模式&#xff0c;确保数据的一致性。然而&#xff0c;这种集成存在一些痛点需要注意&#xff1a; 一致性通过加锁保证&#xff1a;在保证数据一致性时&#xff0c;Debez…

运算符的结合性(形神兼备)

运算符的结合性&#xff08;形神兼备&#xff09; 在编译原理中&#xff0c;产生式就是权威。表达式如果以某产生式进行语法分析&#xff0c;那么就只能按照它的方式进行表达&#xff0c;且不能具有二义性。但是&#xff0c;在表达式中有时会涉及打括号的问题。很多时候&#…