【RabbitMQ】工作队列和发布/订阅模式的具体实现
文章目录
- 建立连接
- 工作队列模式实现
- 创建队列和交换机
- 生产者代码
- 消费者代码
- 运行程序
- 启动消费者
- 启动生产者
- 发布/订阅模式实现
- 创建队列和交换机
- 生产者代码
- 创建交换机
- 声明两个队列
- 绑定队列和交换机
- 发送消息
- 完整代码
- 消费者代码
- 完整代码
- 运行程序
- 启动生产者
- 启动消费者
建立连接
我们把建立连接时,创建的连接工厂部分创建成常量,方便后面进行使用
- 在
rabbitmq
包下,再创建一个constant
包
package rabbitmq.constant; public class Constants { static public final String HOST = "localhost"; static public final int PORT = 5672; static public final String USER_NAME = "study"; static public final String PASSWORD = "study"; static public final String VIRTUAL_HOST = "coding ";
}
工作队列模式实现
和简单模式相比较,工作队列与之不同的就是有多个消费者,其他都一样。所以我们只需要多添加几个消费者即可
创建队列和交换机
在 Constants
中添加:
// 工作队列模式
public static final String WORK_QUEUE = "work.queue ";
生产者代码
package rabbitmq.work; import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import rabbitmq.constant.Constants; import java.io.IOException;
import java.util.concurrent.TimeoutException; public class Producer { public static void main(String[] args) throws IOException, TimeoutException { // 1. 建立连接 ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost(Constants.HOST); connectionFactory.setPort(Constants.PORT); connectionFactory.setUsername(Constants.USER_NAME); connectionFactory.setPassword(Constants.PASSWORD); connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST); Connection connection = connectionFactory.newConnection(); //2. 开启信道 Channel channel = connection.createChannel(); //3. 声明队列 channel.queueDeclare(Constants.WORK_QUEUE, true, false, false, null); //4. 发送消息 for (int i = 0; i < 10; i++) { String msg = "hello work queue..." + i; channel.basicPublish("", Constants.WORK_QUEUE, null, msg.getBytes()); } System.out.println("消息发送成功!"); // 5. 资源释放 channel.close(); connection.close(); }
}
消费者代码
package rabbitmq.work; import com.rabbitmq.client.*;
import rabbitmq.constant.Constants; import java.io.IOException;
import java.util.concurrent.TimeoutException; public class Consumer1 { public static void main(String[] args) throws IOException, TimeoutException, InterruptedException { // 1. 建立连接 ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost(Constants.HOST); connectionFactory.setPort(Constants.PORT); connectionFactory.setUsername(Constants.USER_NAME); connectionFactory.setPassword(Constants.PASSWORD); connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST); Connection connection = connectionFactory.newConnection(); //2. 开启信道 Channel channel = connection.createChannel(); //3. 声明队列 channel.queueDeclare(Constants.WORK_QUEUE, true, false, false, null); //4. 消费消息 DefaultConsumer consumer = new DefaultConsumer(channel){ // 从队列中收到消息,就会执行的方法 @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { //TODO System.out.println("接收到消息: " + new String(body)); } }; channel.basicConsume(Constants.WORK_QUEUE, true, consumer); // 等待程序执行完成 Thread.sleep(2000); // 5. 释放资源
// channel.close();
// connection.close(); }
}
- 多个消费者的代码都一样的
运行程序
我们先启动两个消费者,再启动生产者
- 如果先启动生产者,再启动消费者,由于消息较少,处理较快,那么第一个启动的消费者就会瞬间把 10 条消息消费掉,所以我们先启动两个消费者,再启动生产者
启动消费者
我们将两个消费者启动
- 我们可以看到
rabbitmq
客户端里面,work.queue
队列已经被创建了出来
启动生产者
在启动消费者之后,我们启动生产者,发送 10 条消息到队列中
- 我们可以看到,连个该消费者将 10 条消息消费完了
发布/订阅模式实现
在发布/订阅模式中,多了一个 Exchange
角色
Exchange
常见有三种类型,分别代表不同的路由规则
Fanout
: 广播,将消息交给所有绑定到交换机的队列(Publish/Subscribe
)Direct
: 定向,将消息交给符合指定routingKey
的队列 (Routing
模式)Topic
: 通配符,把消息交给符合routing pattern
(路由模式)的队列(Topics
模式)
也就分别对应不同的工作模式
创建队列和交换机
在 Constants
中添加:
// 发布订阅模式
public static final String FANOUT_EXCHANGE = "fanout.exchange";
public static final String FANOUT_QUEUE1 = "fanout.queue1";
public static final String FANOUT_QUEUE2 = "fanout.queue2";
生产者代码
发布/订阅模式的生产者代码和简单模式类似,只是有些变化
- 需要声明交换机
- 需要指出交换机和队列之间的关系
创建交换机
相比于生产者代码和简单模式,这一步是关键的一步。我们需要声明一个交换机,而不是使用默认交换机
channel.exchangeDeclare(Constants.FANOUT_EXCHANGE, BuiltinExchangeType.FANOUT, true);
- 我们会使用到
exchangeDeclare()
方法
Exchange.DeclareOk exchangeDeclare(String exchange,
BuiltinExchangeType type,
boolean durable,
boolean autoDelete,
boolean internal,
Map<String, Object> arguments) throws IOException;
参数解释:
exchange
:交换机名称type
:交换机类型Direct("direct")
:定向,直连,routing
Fanout("fanout")
:扇形(广播),每个队列都能收到消息TOPIC("topic")
:通配符HEADERS("headers")
:参数匹配(工作时用到的少)
durable
:是否持久化true
:持久化false
:非持久化- 持久化可以将交换器存盘,在服务器重启的时候不会丢失相关信息
autoDelete
:自动删除- 自动删除的前提是至少有一个对类或者交换器与这个交换器绑定,之后所有与这个交换器绑定的对类或交换器都与此解绑
- 而不是这种理解:当与此交换器连接的客户端都断开时,
RabbitMQ
会自动删除本交换器
internal
:内部使用,一般false
- 如果设置为
true
,表示内部使用 - 客户端程序无法直接发送消息到这个交换器中,只能通过交换器路由到交换器这种方式
- 如果设置为
argument
:参数
声明两个队列
// 如果没有一个这样的队列,会自动创建;如果有,则不创建
channel.queueDeclare(Constants.FANOUT_QUEUE1, true, false, false, null);
channel.queueDeclare(Constants.FANOUT_QUEUE2, true, false, false, null);
绑定队列和交换机
channel.queueBind(Constants.FANOUT_QUEUE1, Constants.FANOUT_EXCHANGE, "");
channel.queueBind(Constants.FANOUT_QUEUE2, Constants.FANOUT_EXCHANGE, "");
- 这里会用到
queueBind()
方法
queueBind(String queue, String exchange, String routingKey)
参数解释:
queue
:对类名称exchange
:交换机名称routingKey
:路由key
,路由规则
- 如果交换机类型为
fanout
,routingKey
设置为“”
,表示每个消费者都能收到全部信息
发送消息
String msg = "hello fanout...";
// 第二个参数 routingKey 为空。因为这是广播模式,交换机收到消息后需要全部转发(绑定的时候设为空,发送的时候也为空
channel.basicPublish(Constants.FANOUT_EXCHANGE, "", null, msg.getBytes());
System.out.println("消息发送成功!");
- 这里会用到
basicPublish()
方法
basicPublish(String exchange, String routingKey, AMQP.BasicProperties props, byte[] body)
参数解释:
Exchange
:交换机名称routingKey
:如果交换机类型为fanout
,routingKey
设置为“”
,表示每个消费者都能收到全部信息
完整代码
package rabbitmq.fanout; import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import rabbitmq.constant.Constants; import java.io.IOException;
import java.util.concurrent.TimeoutException; public class Producer { public static void main(String[] args) throws IOException, TimeoutException { // 1. 建立连接 ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost(Constants.HOST); connectionFactory.setPort(Constants.PORT); connectionFactory.setUsername(Constants.USER_NAME); connectionFactory.setPassword(Constants.PASSWORD); connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST); Connection connection = connectionFactory.newConnection(); //2. 开启信道 Channel channel = connection.createChannel(); //3. 声明交换机 /* Exchange.DeclareOk exchangeDeclare(String exchange, BuiltinExchangeType type, boolean durable, boolean autoDelete, boolean internal, Map<String, Object> arguments) throws IOException; 参数解释: exchange:交换机名称 type:交换机类型 DIRECT("direct"),定向,直连,routing FANOUT("fanout"),扇形(广播),每个队列都能收到消息 TOPIC("topic"),通配符 HEADERS("headers"),参数匹配(工作中用的少) durable:是否持久化 autoDelete:自动删除 internal:内部使用(一般false) arguments:参数 */ channel.exchangeDeclare(Constants.FANOUT_EXCHANGE, BuiltinExchangeType.FANOUT, true); // 4. 声明队列 channel.queueDeclare(Constants.FANOUT_QUEUE1, true, false, false, null); channel.queueDeclare(Constants.FANOUT_QUEUE2, true, false, false, null); // 5. 绑定交换机和队列 channel.queueBind(Constants.FANOUT_QUEUE1, Constants.FANOUT_EXCHANGE, ""); channel.queueBind(Constants.FANOUT_QUEUE2, Constants.FANOUT_EXCHANGE, ""); // 6. 发布消息 String msg = "hello fanout..."; // 第二个参数 routingKey 为空。因为这是广播模式,交换机收到消息后需要全部转发(绑定的时候设为空,发送的时候也为空 channel.basicPublish(Constants.FANOUT_EXCHANGE, "", null, msg.getBytes()); System.out.println("消息发送成功!"); // 7. 释放资源 channel.close(); connection.close(); }
}
消费者代码
主要的步骤为:
- 创建
Channel
- 接收消息,并处理
完整代码
package rabbitmq.fanout; import com.rabbitmq.client.*;
import rabbitmq.constant.Constants; import java.io.IOException;
import java.util.concurrent.TimeoutException; public class Consumer1 { public static void main(String[] args) throws IOException, TimeoutException { // 1. 建立连接 ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost(Constants.HOST); connectionFactory.setPort(Constants.PORT); connectionFactory.setUsername(Constants.USER_NAME); connectionFactory.setPassword(Constants.PASSWORD); connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST); Connection connection = connectionFactory.newConnection(); // 2.建立信道 Channel channel = connection.createChannel(); // 3.声明队列(如果队列已经存在,就不会创建;不存在就会创建) channel.queueDeclare(Constants.FANOUT_QUEUE1, true, false, false, null); // 4. 消费信息 DefaultConsumer consumer = new DefaultConsumer(channel) { // 从队列中收到消息,就会执行的方法 @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { System.out.println("接收到消息:" + new String(body)); } }; channel.basicConsume(Constants.FANOUT_QUEUE1, true, consumer); } }
运行程序
启动生产者
- 消息全转发
- 我们可以看到两个队列中分别有了一条消息
- 这就是发布订阅模式,他会把收到的消息都转发
- 交换机绑定了队列
- 这里,我们可以看到交换机和队列之间的绑定关系
启动消费者
消费者 1:
接收到消息:hello fanout...
消费者 2:
接收到消息:hello fanout...
相关文章:
【RabbitMQ】工作队列和发布/订阅模式的具体实现
文章目录 建立连接工作队列模式实现创建队列和交换机生产者代码消费者代码运行程序启动消费者启动生产者 发布/订阅模式实现创建队列和交换机生产者代码创建交换机声明两个队列绑定队列和交换机发送消息完整代码 消费者代码完整代码 运行程序启动生产者启动消费者 建立连接 我…...
loki grafana 页面查看 loki 日志偶发 too many outstanding requests
问题描述 grafana 页面查看 loki 日志偶然出现 too many outstanding requests loki pod 日志报错 levelerror ts2025-05-13T06:15:52.509738812Z callerscheduler_processor.go:158 org_idfake traceID1570d49e6d15b25c msg"error notifying scheduler about finished …...
Python之with语句
文章目录 Python中的with语句详解一、基本语法二、工作原理三、文件操作中的with语句1. 基本用法2. 同时打开多个文件 四、with语句的优势五、自定义上下文管理器1. 基于类的实现2. 使用contextlib模块 六、常见应用场景七、注意事项 Python中的with语句详解 with语句是Python…...
tomcat搭建内网论坛
准备工作: 准备jdk-8u291-linux-x64.tar.gz压缩包与apache-tomcat-9.0.16.tar.gz压缩包。 jdk安装: tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/ cd /usr/local/ ln -s jdk1.8.0_291/ jdk vim /etc/profile.d/jdk.sh cat /etc/profile.d/jdk.s…...
基于开源AI大模型AI智能名片S2B2C商城小程序的零售结算技术创新研究——以京东AI与香港冯氏零售集团智能结算台为例
摘要:本文以京东AI与香港冯氏零售集团共同打造的人工智能结算台为切入点,结合开源AI大模型、AI智能名片及S2B2C商城小程序的技术特性,深入探讨其在零售结算领域的创新应用。研究发现,开源AI大模型为智能结算提供了强大的图像识别与…...
supabase 怎么新建项目?
在 Supabase 中新建项目主要通过官方网站的仪表盘 (Dashboard) 来完成。以下是详细步骤: 通过 Supabase 仪表盘新建项目: 注册/登录 Supabase 账户: 访问 Supabase 官网:https://supabase.com/如果你还没有账户,点击 …...
框架篇八股(自用)
框架篇 Spring框架中的bean不是线程安全的 Scope() singleton单例 prototype多例 一个类中有可修改的成员变量需要考虑线程安全 bean没有可变状态(service类,DAO类) 某种程度单例bean是线程安全的 AOP面向切面编程…...
Flask Docker Demo 项目指南
首先,创建一个新的项目目录并创建必要的文件: mkdir flask-docker-demo cd flask-docker-demo创建一个简单的Flask应用 (app.py): from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, Docker World…...
蓝卓AI智能体平台
在数字化浪潮席卷全球的今天,制造业企业正面临前所未有的挑战:如何将海量数据转化为精准决策?如何让传统生产流程具备“自进化”的智能?如何打破数字化与智能化之间的鸿沟?蓝卓数字科技凭借对工业场景的深刻理解&#…...
typedef unsigned short uint16_t; typedef unsigned int uint32_t;
你提到的这两行是 C/C 中的类型别名定义: typedef unsigned short uint16_t; typedef unsigned int uint32_t;它们的目的是让代码更具可读性和可移植性,尤其在处理精确位数的整数时非常有用。 ✅ 含义解释 typedef unsigned short uint16_t;…...
黑马k8s(五)
1.Namespace 2.Pod run nginx:nginx是pod控制器的名称,不是pod的名称 查看pod更高的参数: 启动一个不存在的镜像:pod 查看 dev下面的pod,第二个pod处于容器创建的状态 查看pod的详情描述: 通过pod的ip&…...
进程间通信分类
前提: 进程具有独立性,要通信就是要让它们:看到同一份资源(某种形式的内存空间,操作系统提供) 本地通信:同一台主机,OS,用系统调用通信。标准:systemV。 S…...
uniapp-商城-56-后台 新增商品(弹窗属性继续分析)
1、概述 前面我们讲了布局和相应商品属性的页面布局。属性是一个弹窗,它是一个cell的组件的实现属性。点击该cell就会调用uni-popup 进行弹窗。基本的页面布局如下: 属性显示其实是个一嵌套的数据显示。 2 页面显示商品属性 点击添加属性 2.1 代码如…...
奇怪的公式
奇怪的公式 背景导入 在剑桥大学,瞥了一眼下面这个公式,我眩晕了,庆幸自己没学数学专业。 1 2 3 4 ⋯ − 1 12 1234\dots -\frac{1}{12} 1234⋯−121 一天,剑桥大学教授哥德弗雷哈代收到一封来自印度的信。写信人叫拉马…...
web 自动化之 PO 设计模式详解
文章目录 一、什么是 POM二、如何基于 POM 进行自动化框架架构?1、base 层封装2、pageobjects 层封装3、TestCases 层封装 三、元素和方法分离&数据分离1、哪些部分可以进行分离2、示例代码 四、总结 一、什么是 POM POM page object model 页面对象模型 WEB 自…...
golang 定时器
写法一: package mainimport ("fmt""sync""time" )type DemoTicker struct {ch <-chan time.Timestop chan struct{}sg *sync.WaitGroup }func main() {count, stopCount : 0, 5demo : DemoTicker{ch: time.Tick(time.Seco…...
ETL 数据集成平台与数据仓库的关系及 ETL 工具推荐
数字化时代企业每天都会产生海量的数据,这些数据分散在不同的系统、数据库和应用中。为了能够有效地利用这些数据,进行数据分析、商业智能决策等,ETL数据集成平台和数据仓库成为了企业数据管理架构中的关键组成部分。本文将深入探讨ETL数据集…...
java架构设计
1.可维护性 封装性,例如将缓存redis封装到一个service,别的地方用到,只需要传参调用就行。如果有一天换国产缓存,只需要修改service,而不需要修改多出引用地方 * 可维护性:后期功能迭代,不可避…...
UDP--DDR--SFP,FPGA实现之指令监测模块实现
指令监测模块实现介绍 如下图所示,为指令监测模块的运行框图 将指令设置为8bytes数据,故需要一个64位寄存器进行缓存,在进行数据缓存时,数据不可以输出至下一级模块,故对数据和有效指示信号也应该进行相应延迟&#…...
Houdini安装SideFX Labs工具架
开源免费的 https://github.com/sideeffects/SideFXLabs/releases 下载后解压 放到文档里 新建一个packages文件夹 把SideFXLabs.json 复制到packages文件夹 删除一些没用的平台 修改相关路径即可 然后就能在houdini里搜到 autouv 节点 不然没装是没有这个节点的 参考教程 …...
uniapp+vue3+uview来开发我们的项目
前言: 就像我们vue的web的框架element、iview等一样,我们的uni-app开发也有适合的他的框架,除了他本身的扩展组件以外,第三方好用的就是就是uview了。 实现效果: 官网信息: vue2版本:uview-ui …...
MySQL 5.7在CentOS 7.9系统下的安装(上)——以rpm包的形式下载mysql
这里我们主要以CentOS 7.9为例进行介绍,会顺带讲讲Ubuntu的操作方式。 目录 一、检查自己的机器上是否安装有MySQL: (1)第一步:检查系统中是否有正在运行的MySQL服务: (2) 检查当…...
【图像处理基石】什么是油画感?
在图像处理中,“油画感”通常指图像呈现出类似油画的块状纹理、笔触痕迹或色彩过渡不自然的现象,表现为细节模糊、边缘不锐利、颜色断层或人工纹理明显。这种问题常见于照片处理、视频帧截图或压缩后的图像,本质是画质受损的一种表现。以下是…...
深度学习之优化器【从梯度下降到自适应学习率算法】(pytorch版)
文章目录 优化器(Optimizer)二 基础优化器1. 梯度下降(Gradient Descent, GD)2. 随机梯度下降(Stochastic Gradient Descent, SGD) 三 动量优化算法标准动量优化(Momentum)自适应学习…...
React+Webpack 脚手架、前端组件库搭建
链接: 自己写的开发文档,希望大家多多批评...
基于 Python 和 OpenAI 接口规范的本地多轮对话
在自然语言处理的应用中,多轮对话系统是一种极具实用性的功能,无论是聊天机器人、客服系统还是智能助手,都离不开对上下文的持续理解和响应。随着 Ollama 等轻量级模型服务的流行,我们也可以在本地轻松部署语言模型,并…...
binlog日志以及MySQL的数据同步
binlog binlog是什么 记录所有数据库表结构,表数据的修改,但是不会记录Select和Show这类操作 binlog有几种记录模式 三种记录模式 statement: 基于SQL语句的复制 row: 基于行的复制,记录每行数据的变更(保证了数据的一致性&a…...
串口模块详细讲解
目录 1.串口介绍 2。STC-ISP串口功能介绍 3.接口及引脚定义 4.串口知识点 4.1 硬件电路 4.2 电平标准 4.3 相关术语 4.4 常见通信接口比较 4.5 51单片机的UART 4.6 串口参数及时序图 4.7 串口模式图 4.8 串口和中断系统 4.9 串口相关寄存器 5.串口向电脑发送信息…...
Flannel UDP 模式的优缺点
UDP 模式的特点、优缺点 优点 高兼容性:通过用户态 UDP 封装,无需内核支持 VXLAN 或其他高级网络功能,适用于旧版 Linux 内核或非标准环境。部署灵活:无需特殊内核模块或硬件支持,易于在异构环境中部署。简单实现&am…...
前端——布局方式
普通流(标准流) 所谓的标准流: 就是标签按照规定好默认方式排列. 1. 块级元素会独占一行,从上向下顺序排列。 常用元素:div、hr、p、h1~h6、ul、ol、dl、form、table 2. 行内元素会按照顺序,从左到右顺序排列&am…...
山东大学软件学院计算机图形学2025期末考题回忆版
任课教师:周元峰老师 考试时间:2025年5月13日 这次考试比之前的往年题多了写和读OpenGL代码的题目,其它和能找到的往年题(19、21、24)的差别不大。写完回忆题又发现自已错了好几个原题。。。。。。。。。。。。。。。…...
数控滑台:革新传统加工方式的利器
数控技术作为当今制造业中的重要发展方向,已深入到了各个领域,其中数控滑台作为数控加工领域的一个重要组成部分,对于提高加工效率、精度和质量具有重要意义。本文将重点探讨数控滑台的原理、优势以及在工业制造领域的应用。 一、数控滑台的…...
【WIN】笔记本电脑忘记密码解决办法/笔记本电脑重装系统笔记/bitlocker忘记密码的解决办法
通过安全模式下的CMD命令找回 具体的步骤就是: 首先通过笔记本的对应的一个进入安全模式的一个方式 进入安全模式之后,一直点着这个诊断,然后高级选项进去就可以看到了。 但是这种方法应该是属于安全漏洞,所以只适合老版本。如果是…...
手机相册的 “智能分类” 功能
我们以手机相册的 “智能分类” 功能(识别图片中的物体类型)为例,演示如何使用 TensorFlow Lite 框架将端侧模型部署到 Android 设备上。该场景通用且覆盖端侧部署的核心步骤:模型准备→环境配置→代码集成→硬件加速→业务调用。…...
配置Hadoop集群-上传文件
(一)上传小文件 上传文件的时候,我们传一个大一点的(>128M),再传一个小一点的。对于大一点的文件,我们要去看看它是否会按128M为单位去拆分这个大文件,而拆分成大文件之后&#x…...
SpringBoot整合MQTT实战:基于EMQX实现双向设备通信(附源码)
简言: 在万物互联的时代,MQTT协议凭借其轻量级、高效率的特性,已成为物联网通信的事实标准。本教程将带领您在Ubuntu系统上搭建EMQX 5.9.0消息服务器,并使用Spring Boot快速实现两个客户端的高效通信。通过本指南,您将…...
windows c++ (9) 程序内注册服务并修改登录账户
实现方式全以批处理文件实现,直接在进程内调用即可 1、注册服务 注册服务manage.bat内容如下 echo off setlocalset ServiceExeYouProcess.exe set ServiceNameYouProcess set BASE%~dp0:: 检查命令行参数 if "%~1""" (echo Usage: manage_p…...
按键精灵ios脚本新增元素功能助力辅助工具开发(三)
元素节点功能(iOSElement) 在按键精灵 iOS 新版 APP v2.2.0 中,新增了元素节点功能 iOSElement,该功能包含共 15 个函数。这一功能的出现,为开发者在处理 iOS 应用界面元素时提供了更为精准和高效的方式。通过这些函…...
OpenHarmony平台驱动开发(十五),SDIO
OpenHarmony平台驱动开发(十五) SDIO 概述 功能简介 SDIO(Secure Digital Input and Output)由SD卡发展而来,与SD卡统称为MMC(MultiMediaCard),二者使用相同的通信协议。SDIO接口…...
ICMP协议详解及不同VLAN/VXLAN主机通信中的ICMP示例
一、ICMP协议概述 ICMP(Internet Control Message Protocol,互联网控制消息协议)是TCP/IP协议栈中的一项核心协议,用于在IP网络中传输控制消息和错误报告。ICMP定义在RFC 792中,主要用于诊断网络问题和传递控制信息。…...
SQL server数据库实现远程跨服务器定时同步传输数据
项目背景 数据需要定期迁移,数据存在于客户政务外网下,从旧数据库迁移到新数据库中,且要求能够定时增量同步。 注意: 源数据库所在服务器为windows服务器,目标数据库所在服务器为linux服务器。 源数据库所在windows服…...
贝叶斯优化Transformer融合支持向量机多变量时间序列预测,Matlab实现
贝叶斯优化Transformer融合支持向量机多变量时间序列预测,Matlab实现 目录 贝叶斯优化Transformer融合支持向量机多变量时间序列预测,Matlab实现效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.BO-TransformerSVM多变量时间序列预测,…...
服务器租用与托管注意事项有哪些
在当今数字化的时代,服务器对于企业和个人的重要性不言而喻。无论是搭建网站、运行应用程序,还是存储数据,服务器都是关键的基础设施。而服务器租用与托管作为常见的选择方式,其中的注意事项你可不能马虎。 企业在进行租用或者是…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.3 风险指标可视化监控
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL金融风控分析之风险指标可视化监控实战一、引言二、案例背景三、数据准备(一)数据来源与字段说明(二)数据清洗 四、…...
【AI提示词】贝叶斯分析专家
提示说明 一名专业的贝叶斯推断专家,具备统计建模、数据分析和不确定性决策方面的专长。 提示词 # Role: 贝叶斯分析专家## Profile - language: 中文 - description: 一名专业的贝叶斯推断专家,具备统计建模、数据分析和不确定性决策方面的专长 - ba…...
星云智控自定义物联网实时监控模板-为何成为痛点?物联网设备的多样化-优雅草卓伊凡
星云智控自定义物联网实时监控模板-为何成为痛点?物联网设备的多样化-优雅草卓伊凡 引言:物联网监控的模板革命 在万物互联的时代,设备监控已成为保障物联网系统稳定运行的核心环节。传统的标准化监控方案正面临着设备类型爆炸式增长带来的…...
#跟着若城学鸿蒙#HarmonyOS NEXT学习之Blank组件详解
一、组件介绍 Blank(空白)组件是HarmonyOS NEXT中一个简单但非常实用的UI组件,它主要用于在布局中创建空白区域,帮助开发者更灵活地控制界面元素之间的间距和布局结构。虽然Blank组件本身不显示任何内容,但它在界面设…...
《Docker 入门与进阶:架构剖析、隔离原理及安装实操》
1 docker 简介 1.1 Docker 的优点 Docker 是一款开放平台,用于应用程序的开发、交付与运行,能将应用和基础架构分离,实现软件快速交付 ,还能以统一方式管理应用和基础架构,缩短代码从编写到上线的时间。其核心优势如…...
OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——mqtt库
准备工作 请依照这篇文章搭建环境 OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——环境配置_openharmony交叉编译-CSDN博客 下载 wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.5/gnutls-3.5.9.tar.xz 解压 tar -xf mkdir ./out cd ./out Cmake命…...
【LeetCode 热题 100】二叉树的最大深度 / 翻转二叉树 / 二叉树的直径 / 验证二叉搜索树
⭐️个人主页:小羊 ⭐️所属专栏:LeetCode 热题 100 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 二叉树的中序遍历二叉树的最大深度翻转二叉树对称二叉树二叉树的直径二叉树的层序遍历将有序数组转换为二叉搜索树验…...