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

使用Java创建RabbitMQ消息生产者的详细指南

目录

在现代分布式系统中,消息队列是实现异步通信的重要工具。RabbitMQ作为一种流行的开源消息代理,支持多种消息协议,广泛应用于微服务架构和事件驱动的应用程序中。本文将深入探讨如何使用Java创建RabbitMQ的消息生产者,发送消息到指定的交换机和队列,并涵盖相关的概念、配置和最佳实践。

1. 环境准备

Maven依赖

2. 创建生产者代码

代码解析

3. 运行程序

验证消息是否发送成功

4. RabbitMQ的概念与特性

4.1 消息

4.2 交换机

4.3 队列

4.4 路由键

5. 发送不同类型的消息

6. 消费者的实现

代码解析

运行消费者

7. 发送和接收不同类型的消息

发送和接收JSON消息的示例

更新生产者发送JSON消息

创建接收JSON消息的消费者

8. 处理异常和保证消息传递

9. RabbitMQ最佳实践

10. 总结


在现代分布式系统中,消息队列是实现异步通信的重要工具。RabbitMQ作为一种流行的开源消息代理,支持多种消息协议,广泛应用于微服务架构和事件驱动的应用程序中。本文将深入探讨如何使用Java创建RabbitMQ的消息生产者,发送消息到指定的交换机和队列,并涵盖相关的概念、配置和最佳实践。

1. 环境准备

在开始之前,我们需要确保开发环境的准备工作就绪。首先,确保您已经安装了RabbitMQ服务器,并且能够正常访问。您可以在RabbitMQ官方网站下载并安装RabbitMQ。安装完成后,启动RabbitMQ服务,并确保其在默认端口5672上运行。

Maven依赖

在Java项目中使用RabbitMQ,您需要在pom.xml文件中添加RabbitMQ的AMQP客户端库依赖。以下是所需的Maven依赖项:

<dependency>  <groupId>com.rabbitmq</groupId>  <artifactId>amqp-client</artifactId>  <version>5.15.0</version> <!-- 请根据需要选择合适的版本 -->  
</dependency>

确保您的项目能够访问Maven中央仓库,以便下载所需的依赖项。

2. 创建生产者代码

接下来,我们将创建一个简单的RabbitMQ消息生产者。以下是完整的Java代码示例:

import com.rabbitmq.client.*;  public class Producer {  public static void main(String[] args) throws Exception {  // RabbitMQ服务器的连接信息  String host = "10.56.11.34"; // RabbitMQ服务器地址  String userName = "DHCloud7X"; // 用户名  String passWord = "Cloud0#1nw2qezr"; // 密码  String exchangeName = "cnk_exchangeName"; // 交换机名称  String queueName = "cnk_queueName"; // 队列名称  // 创建连接工厂并设置连接参数  ConnectionFactory connectionFactory = new ConnectionFactory();  connectionFactory.setHost(host);  connectionFactory.setUsername(userName);  connectionFactory.setPassword(passWord);  connectionFactory.setPort(5672); // 默认端口  connectionFactory.setConnectionTimeout(20000); // 超时时间,单位毫秒  connectionFactory.setRequestedHeartbeat(10); // 心跳,单位秒  // 启用重连机制  connectionFactory.setAutomaticRecoveryEnabled(true); // 设置网络异常重连  connectionFactory.setNetworkRecoveryInterval(10000); // 设置10秒重连一次  connectionFactory.setTopologyRecoveryEnabled(true); // 设置重新声明交换器、队列等信息  // 创建连接和信道  try (Connection connection = connectionFactory.newConnection();   Channel channel = connection.createChannel()) {  // 声明交换机  channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT, true, false, null);  // 声明队列  channel.queueDeclare(queueName, true, false, false, null);  // 队列绑定  channel.queueBind(queueName, exchangeName, queueName);  // 发送消息  String message = "hello rabbitMq";  channel.basicPublish(exchangeName, queueName, null, message.getBytes());  System.out.println("发送成功!");  } catch (Exception e) {  e.printStackTrace();  }  }  
}

代码解析

  1. 连接参数:我们使用ConnectionFactory来配置RabbitMQ的连接参数,包括主机、端口、用户名和密码等。

  2. 重连机制:为了提高系统的健壮性,我们启用了自动重连和拓扑重连功能。这意味着在网络故障或RabbitMQ服务重启的情况下,生产者能够自动恢复连接。

  3. 创建连接和信道:通过connectionFactory.newConnection()创建连接,并使用connection.createChannel()创建信道。信道是执行RabbitMQ操作的主要接口。

  4. 声明交换机和队列:使用channel.exchangeDeclare()channel.queueDeclare()声明交换机和队列。我们使用DIRECT类型的交换机,这意味着消息将根据路由键精确路由到绑定的队列。

  5. 绑定队列:通过channel.queueBind()将队列与交换机绑定,指定路由键。

  6. 发送消息:使用channel.basicPublish()方法发送消息。消息的内容在这里是一个简单的字符串“hello rabbitMq”。

  7. 关闭资源:使用try-with-resources语句自动关闭信道和连接,确保资源得到释放。

3. 运行程序

确保RabbitMQ服务正在运行后,编译并运行上述代码。如果一切正常,您将看到“发送成功!”的提示,表示消息已成功发送。

验证消息是否发送成功

要验证消息是否成功发送到队列中,您可以使用RabbitMQ管理界面。访问http://localhost:15672(如未更改默认配置),使用您的RabbitMQ凭据登录。

在管理界面中,您可以查看交换机、队列及其消息状态。您将看到我们创建的队列cnk_queueName,并且其中应该有一条消息。

4. RabbitMQ的概念与特性

在深入RabbitMQ之前,了解一些基本概念是非常重要的:

4.1 消息

消息是RabbitMQ中传递的数据单元。它由消息体和一些元数据(如路由键、属性等)组成。消息体可以是任意字节数据,通常是字符串、JSON或序列化对象。

4.2 交换机

交换机是RabbitMQ的核心组件之一,负责接收来自生产者的消息并根据路由规则将其分发到一个或多个队列。RabbitMQ支持多种类型的交换机,包括:

  • Direct Exchange:根据路由键精确路由消息。
  • Fanout Exchange:将消息广播到所有绑定的队列。
  • Topic Exchange:根据路由键的模式匹配路由消息。
  • Headers Exchange:根据消息的头部属性路由消息。

4.3 队列

队列是RabbitMQ中存储消息的地方。消息在队列中等待消费者处理。队列具有以下特性:

  • 持久性:队列可以设置为持久化,以确保在RabbitMQ重启后消息不会丢失。
  • 消息确认:消费者在处理消息后需要确认,以确保消息被成功消费。

4.4 路由键

路由键是消息的一个重要属性,用于决定消息的路由路径。生产者在发送消息时指定路由键,交换机根据路由键将消息路由到相应的队列。

5. 发送不同类型的消息

在实际应用中,您可能需要发送不同类型的消息,例如JSON格式或二进制数据。以下是如何发送JSON格式消息的示例:

import com.rabbitmq.client.*;  
import com.fasterxml.jackson.databind.ObjectMapper;  public class JsonProducer {  public static void main(String[] args) throws Exception {  // 连接参数同上...  String exchangeName = "json_exchange";  String queueName = "json_queue";  ConnectionFactory connectionFactory = new ConnectionFactory();  // 设置连接参数...  try (Connection connection = connectionFactory.newConnection();   Channel channel = connection.createChannel()) {  // 声明交换机和队列...  channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT, true, false, null);  channel.queueDeclare(queueName, true, false, false, null);  channel.queueBind(queueName, exchangeName, queueName);  // 创建一个对象并转换为JSON格式  Message messageObj = new Message("Hello, RabbitMQ!", 1);  ObjectMapper objectMapper = new ObjectMapper();  String jsonMessage = objectMapper.writeValueAsString(messageObj);  // 发送JSON消息  channel.basicPublish(exchangeName, queueName, null, jsonMessage.getBytes());  System.out.println("JSON消息发送成功!");  } catch (Exception e) {  e.printStackTrace();  }  }  static class Message {  private String content;  private int id;  public Message(String content, int id) {  this.content = content;  this.id = id;  }  // getters and setters...  }  
}

在这个示例中,我们使用Jackson库将一个简单的Java对象转换为JSON格式,并将其发送到RabbitMQ。确保在pom.xml中添加Jackson的依赖:

<dependency>  <groupId>com.fasterxml.jackson.core</groupId>  <artifactId>jackson-databind</artifactId>  <version>2.14.0</version> <!-- 请根据需要选择合适的版本 -->  
</dependency>

6. 消费者的实现

为了完整性,我们也需要实现一个消费者来接收和处理消息。以下是一个简单的RabbitMQ消费者示例:

import com.rabbitmq.client.*;  public class Consumer {  public static void main(String[] args) throws Exception {  // RabbitMQ连接信息  String host = "10.56.11.34"; // RabbitMQ服务器地址  String userName = "DHCloud7X"; // 用户名  String passWord = "Cloud0#1nw2qezr"; // 密码  String exchangeName = "cnk_exchangeName"; // 交换机名称  String queueName = "cnk_queueName"; // 队列名称  // 创建连接工厂并设置连接参数  ConnectionFactory connectionFactory = new ConnectionFactory();  connectionFactory.setHost(host);  connectionFactory.setUsername(userName);  connectionFactory.setPassword(passWord);  connectionFactory.setPort(5672); // 默认端口  connectionFactory.setConnectionTimeout(20000); // 超时时间,单位毫秒  connectionFactory.setRequestedHeartbeat(10); // 心跳,单位秒  // 启用重连机制  connectionFactory.setAutomaticRecoveryEnabled(true); // 设置网络异常重连  connectionFactory.setNetworkRecoveryInterval(10000); // 设置10秒重连一次  connectionFactory.setTopologyRecoveryEnabled(true); // 设置重新声明交换器、队列等信息  // 创建连接和信道  try (Connection connection = connectionFactory.newConnection();  Channel channel = connection.createChannel()) {  // 声明队列(确保队列存在)  channel.queueDeclare(queueName, true, false, false, null);  // 定义消息处理回调  DeliverCallback deliverCallback = (consumerTag, delivery) -> {  String message = new String(delivery.getBody(), "UTF-8");  System.out.println("接收到消息: " + message);  };  // 开始消费消息  channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });  System.out.println("消费者已启动,等待接收消息...");  // 保持程序运行以接收消息  Thread.sleep(Long.MAX_VALUE);  } catch (Exception e) {  e.printStackTrace();  }  }  
}

代码解析

  1. 连接配置:与生产者相似,消费者也需要设置连接信息,包括RabbitMQ的主机、用户名和密码等。

  2. 声明队列:使用channel.queueDeclare()确保要订阅的队列存在。即使队列已经存在,调用此方法也不会对其进行修改。

  3. 消息处理回调:定义一个DeliverCallback回调,用于处理接收到的消息。delivery.getBody()获取消息的内容,并转换为字符串形式进行打印。

  4. 开始消费消息:使用channel.basicConsume()开始消费消息,这里我们传入队列名称、自动确认模式(设置为true表示处理完消息后自动确认)、处理消息的回调和一个空的取消回调。

  5. 保持程序运行:通过调用Thread.sleep(Long.MAX_VALUE)保持程序运行,以便持续接收消息。

运行消费者

在运行消费者之前,确保RabbitMQ服务器正常运行,并使用前面步骤发送了一些消息。启动消费者代码后,它将持续监听队列并打印接收到的消息。

7. 发送和接收不同类型的消息

在实践中,您可能需要处理多种格式的消息。RabbitMQ允许您发送和接收二进制数据、字符串、JSON和XML等。

发送和接收JSON消息的示例

为了实现更复杂的消息处理,您可以将消息体设计为JSON格式,以下是发送和接收JSON格式消息的示例。

更新生产者发送JSON消息

我们已经在前面的部分中创建了一个发送JSON消息的生产者。这里简单回顾一下:

import com.fasterxml.jackson.databind.ObjectMapper;  public class JsonProducer {  public static void main(String[] args) throws Exception {  // 连接和信道的配置同上...  String exchangeName = "json_exchange";  String queueName = "json_queue";  // 创建连接和信道  try (Connection connection = connectionFactory.newConnection();   Channel channel = connection.createChannel()) {  // 创建对象  Message messageObj = new Message("Hello, RabbitMQ!", 1);  ObjectMapper objectMapper = new ObjectMapper();  String jsonMessage = objectMapper.writeValueAsString(messageObj);  // 发送JSON消息  channel.basicPublish(exchangeName, queueName, null, jsonMessage.getBytes());  System.out.println("JSON消息发送成功!");  }  }  static class Message {  private String content;  private int id;  public Message(String content, int id) {  this.content = content;  this.id = id;  }  // getters和setters...  }  
}
创建接收JSON消息的消费者

以下是一个简单的消费者示例,用于接收JSON消息并转换为对象:

import com.fasterxml.jackson.databind.ObjectMapper;  
import com.rabbitmq.client.*;  public class JsonConsumer {  public static void main(String[] args) throws Exception {  // 连接和信道的配置同上...  String exchangeName = "json_exchange";  String queueName = "json_queue";  // 创建连接和信道  try (Connection connection = connectionFactory.newConnection();   Channel channel = connection.createChannel()) {  // 声明队列(确保队列存在)  channel.queueDeclare(queueName, true, false, false, null);  // JSON处理器  ObjectMapper objectMapper = new ObjectMapper();  DeliverCallback deliverCallback = (consumerTag, delivery) -> {  String jsonMessage = new String(delivery.getBody(), "UTF-8");  // 将接收到的JSON字符串转换为Message对象  Message message = objectMapper.readValue(jsonMessage, Message.class);  System.out.println("接收到消息: 内容 = " + message.getContent() + ", ID = " + message.getId());  };  // 开始消费消息  channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });  System.out.println("JSON消费者已启动,等待接收消息...");  // 保持程序运行以接收消息  Thread.sleep(Long.MAX_VALUE);  }  }  static class Message {  private String content;  private int id;  // Getters 和 Setters...  public String getContent() {  return content;  }  public void setContent(String content) {  this.content = content;  }  public int getId() {  return id;  }  public void setId(int id) {  this.id = id;  }  }  
}

8. 处理异常和保证消息传递

在实际应用中,需要注意异常处理和消息的可靠性。这包括:

  • 消息确认:使用手动确认模式来确保消息被消费者成功处理。可以在basicConsume时将第二个参数设置为false,消费者处理完消息后使用channel.basicAck(deliveryTag, false)确认。

  • 消息重试与死信队列:在处理消息失败时,可以选择重试或将其发送到死信队列(DLQ),以便后续分析和处理。

  • 事务:RabbitMQ支持事务,您可以使用channel.txSelect()channel.txCommit()channel.txRollback()来管理事务。但需要注意,事务可能会引入性能开销。

9. RabbitMQ最佳实践

  • 合理配置队列:根据业务需求配置持久性、消息 TTL(存活时间)、最大长度等,确保队列能够高效工作。

  • 监控和管理:使用RabbitMQ管理插件来监控队列、交换机和消费者的性能和状态,及时发现和解决问题。

  • 异步处理:利用消息队列的异步特性解耦系统,让生产者与消费者独立扩展。

  • 安全性考虑:确保RabbitMQ的访问权限配置合理,使用SSL/TLS加密连接,以增强系统的安全性。

10. 总结

  • 在本文中,我们深入探讨了如何使用Java创建RabbitMQ的消息生产者和消费者,并介绍了RabbitMQ的基本概念及其关键特性。通过这些示例,您可以更好地理解异步消息通信的实现方法以及RabbitMQ在现代分布式系统中的应用价值。

    RabbitMQ不仅为系统间的通信提供了解耦的解决方案,其强大的功能和灵活的配置选项使其成为很多企业首选的消息队列方案。希望这篇指南能帮助您在未来的项目中灵活运用RabbitMQ。

相关文章:

使用Java创建RabbitMQ消息生产者的详细指南

目录 在现代分布式系统中&#xff0c;消息队列是实现异步通信的重要工具。RabbitMQ作为一种流行的开源消息代理&#xff0c;支持多种消息协议&#xff0c;广泛应用于微服务架构和事件驱动的应用程序中。本文将深入探讨如何使用Java创建RabbitMQ的消息生产者&#xff0c;发送消息…...

【LC】160. 相交链表

题目描述&#xff1a; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&…...

Spark架构及运行流程

Spark架构图 Driver&#xff1a; 解析用户的应用程序代码&#xff0c;转化为作业(job)。创建SparkContext上下文对象&#xff0c;其负责与资源管理器(ClusterManager)通信&#xff0c;进行资源的申请、任务的分配和监控等。跟踪Executor的执行情况。可通过UI界面查询运行情况。…...

Linux安装Python2.7.5(centos自带同款)

卸载已安装的python,防止版本兼容问题 rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps 删除残余文件 whereis python |xargs rm -frv 安装前提是已安装gcc和g gcc --version g --version 下载安装python2.7.5 https://www.python.org/downloads/release/pyt…...

上传ssh公钥到目标服务器

创建密钥 ssh-keygen -t rsa -b 4096 -C "xxxx.xx"上传 sudo ssh-copy-id -i /Users/xx/.ssh/id_rsa.pub root127.0.0.1...

【LLMs】用LM Studio本地部署离线大语言模型

文章目录 一、下载LM Studio二、下载大语言模型1. 查看模型介绍2. 点击模型文件进行下载2.1 完整下载2.2 部分下载 三、加载模型1. 打开LM Studio图形化界面&#xff0c;点击**My Models**2. 然后&#xff0c;点击“...”&#xff0c;选择“change”&#xff0c;选择刚下载好的…...

SpringBoot下类加入容器的几种方式

SpringBoot下类加入容器的几种方式 在 Spring Boot 中&#xff0c;类加入容器的方式不仅多样&#xff0c;而且每种方式都有其特定的使用场景。以下是几种常见的将类加入 Spring 容器的方法及其适用场景&#xff1a; 1. 使用 Component 及其派生注解 使用场景&#xff1a;当开…...

【Mysql】忘记Root密码后如何不影响数据进行重置密码

方法一&#xff1a;通用方法--启动时跳过权限表 1> 停止数据库 以管理员方式打开cmd&#xff01;&#xff01; C:\Users\Administrator>net stop mysql MySQL 服务正在停止.. MySQL 服务已成功停止。 2> 启动时跳过权限表 mysqld --console --skip-grant-tables -…...

宝塔内设置redis后,项目以及RedisDesktopManager客户端连接不上!

项目展现问题&#xff1a; Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to xxx.宝塔外链.ip.xxxx:6379 redis客户端连接失败&#xff1a; 1、宝塔中确认redis端口已放行 2、修改redis的配置 bind&#x…...

一文了解模式识别顶会ICPR 2024的研究热点与最新趋势

简介 对模式识别研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICPR 2024的研究热点与最新趋势&#xff0c;帮助读者了解和跟踪模式识别的前沿研究方向。本推文的作者是黄星宇&#xff0c;审校为邱雪和许东舟。 一、会议介绍 ICPR…...

【深度学习】深刻理解BERT

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由Google于2018年提出的一种预训练的语言表示模型&#xff0c;它基于Transformer架构并能够处理自然语言处理&#xff08;NLP&#xff09;中的多种任务。BERT的核心创新是其使用了双向编…...

一种基于通义千问prompt辅助+Qwen2.5-coder-32b+Bolt.new+v0+Cursor的无代码对话网站构建方法

前言 今年似乎大模型之间的“内卷”已经有些偃旗息鼓了&#xff0c;各大技术公司逐渐从单纯追求模型参数量的竞赛中抽身&#xff0c;转向更加注重模型的实际应用效果与效率&#xff0c;开始内卷起了LLM“载具” 不知道这个词是不是我第一个发明的哈&#xff0c;总之我更喜欢…...

Java版-图论-最小生成树-Kruskal算法

实现描述 为了造出一棵最小生成树&#xff0c;我们从最小边权的边开始&#xff0c;按边权从小到大依次加入&#xff0c;如果某次加边产生了环&#xff0c;就扔掉这条边&#xff0c;直到加入了 n-1 条边&#xff0c;即形成了一棵树。 实现代码 首选我们对所有的边&#xff0c…...

计算机网络知识总结

1.网络协议是什么&#xff1f; 在计算机网络要做到有条不紊地交换数据&#xff0c;就必须遵守一些约定好的规则&#xff0c;比如交换数据地格式&#xff0c;是否需要发送一个应答信息。这些规则被称为网络协议。 分层结构 应用层&#xff1a;为计算机用户提供服务表示层&…...

普通算法——欧拉筛

欧拉筛 思路&#xff1a; 对欧拉筛的实现&#xff0c;主要是依靠一个数组模拟的栈来实现&#xff0c;核心思路为用栈储存已经发现的素数 在之后的遍历中&#xff0c;即可以素数数组中的数为因数来筛出此素数的倍数 遍历是以当前的 i i i 值为基数&#xff0c;来乘当前素数数…...

【知识科普】DNS(域名解析服务)深入解读

文章目录 概述一、基本概念二、域名解析的原理三、域名解析的类型四、域名解析的常见问题及解决方法五、域名解析的重要性 部署一、准备环境二、安装DNS软件三、配置DNS服务器四、测试DNS解析五、维护和管理DNS服务器 配置文件一、BIND DNS服务器配置文件格式二、Windows系统DN…...

数据结构第一弹-数据结构在不同领域的应用

大家好&#xff0c;今天和大家一起总结一下数据结构在不同领域和场景的应用~ 不同的数据结构适用于解决不同类型的问题&#xff0c;从简单的数组到复杂的图结构&#xff0c;每种数据结构都有其独特的应用场景。 1. 数组与链表 1.1 概念 数组&#xff1a;一种线性数据结构&a…...

如何创建基于udp的客户端和服务端

1.先创建好udpServer.hpp、udpServer.cc、udpClient.hpp、udpClient.cc的框架。 #pragma once #include <string> #include <iostream> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <cerrno> #include…...

ThinkPHP框架审计--基础

基础入门 搭建好thinkphp 查看版本方法&#xff0c;全局搜version 根据开发手册可以大致了解该框架的路由 例如访问url http://127.0.0.1:8094/index.php/index/index/index 对应代码位置 例如在代码下面添加新方法 那么访问这个方法的url就是 http://127.0.0.1:8094/index.…...

Java8 CompletableFuture异步编程

文章目录 CompletableFuturede介绍CompletableFuturede使用场景常用异步编程实现方案- Thread- ExecutorService- CountDownLatch- CyclicBarrier- ForkJoinPool- CompletableFuture各种实现方案总结 CompletableFuturede结构结构梳理- Future接口- CompletionStage接口常用方法…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...