RabbitMQ 工作模式使用案例之(发布订阅模式、路由模式、通配符模式)

article/2025/8/11 23:23:18

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~
🌱🌱个人主页:奋斗的明志
🌱🌱所属专栏:RabbitMQ

📚本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为展示我的学习过程及理解。文笔、排版拙劣,望见谅。

在这里插入图片描述

发布订阅模式、路由模式、通配符模式

  • 一、Publish/Subscribe(发布/订阅)
    • 1、引入依赖
    • 2、编写配置类
    • 3、编写生产者代码
    • 4、编写消费者代码
  • 二、Routing (路由模式)
    • 1、引入依赖
    • 2、编写配置类
    • 3、编写生产者代码
    • 4、编写消费者代码
  • 三、Topics (通配符模式)
    • 1、引入依赖
    • 2、编写配置类
    • 3、编写生产者代码
    • 4、编写消费者代码

一、Publish/Subscribe(发布/订阅)

在发布/订阅模型中,多了一个Exchange角色.
Exchange 常见有三种类型, 分别代表不同的路由规则
a) Fanout:广播,将消息交给所有绑定到交换机的队列 (Publish/Subscribe模式)
b) Direct:定向,把消息交给符合指定routing key的队列(Routing模式)
c) Topic:通配符,把消息交给符合routing pattern(路由模式)的队列(Topics模式)
也就分别对应不同的工作模式

在这里插入图片描述

1、引入依赖


<dependencies><!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.20.0</version></dependency>
</dependencies>

2、编写配置类

package rabbitmq.constant;public class Constants {public static final String HOST = "123.57.16.61";public static final Integer PORT = 5672;public static final String USERNAME = "study";public static final String PASSWORD = "study";public static final String VIRTUAL_HOST = "bite";//发布订阅模式public static final String FANOUT_EXCHANGE = "fanout.exchange";public static final String FANOUT_QUEUE1 = "fanout.queue1";public static final String FANOUT_QUEUE2 = "fanout.queue2";
}

3、编写生产者代码

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 {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost(Constants.HOST);connectionFactory.setPort(Constants.PORT);connectionFactory.setUsername(Constants.USERNAME);connectionFactory.setPassword(Constants.PASSWORD);connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST);Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//声明交换机/*** 交换机名称,交换机类型,开启可持久化(关机数据不会丢失)*/channel.exchangeDeclare(Constants.FANOUT_EXCHANGE, BuiltinExchangeType.FANOUT, true);//声明队列//queueDeclare 队列声明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, "");//发布消息String msg = "hello fanout...";//basicPublish (基础发布)channel.basicPublish(Constants.FANOUT_EXCHANGE, "", null, msg.getBytes());System.out.println("消息发送成功!!!");//关闭资源channel.close();connection.close();}
}

点击运行:

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

4、编写消费者代码

消费者1:

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 {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost(Constants.HOST);connectionFactory.setPort(Constants.PORT);connectionFactory.setUsername(Constants.USERNAME);connectionFactory.setPassword(Constants.PASSWORD);connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST);Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//声明队列//queueDeclare 队列声明 (也可以省略)channel.queueDeclare(Constants.FANOUT_QUEUE1, true, false, false, null);//消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Overridepublic 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);}
}

消费者2:

package rabbitmq.fanout;import com.rabbitmq.client.*;
import rabbitmq.constant.Constants;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Consumer2 {public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost(Constants.HOST);connectionFactory.setPort(Constants.PORT);connectionFactory.setUsername(Constants.USERNAME);connectionFactory.setPassword(Constants.PASSWORD);connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST);Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//声明队列//queueDeclare 队列声明 (也可以省略)channel.queueDeclare(Constants.FANOUT_QUEUE2, true, false, false, null);//消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("接收到消息:" + new String(body));}};channel.basicConsume(Constants.FANOUT_QUEUE2,true,consumer);}
}

在这里插入图片描述

二、Routing (路由模式)

队列和交换机的绑定, 不能是任意的绑定了, 而是要指定⼀个BindingKey(RoutingKey的⼀种)
消息的发送方在向 Exchange 发送消息时, 也需要指定消息的 RoutingKey
Exchange也不再把消息交给每⼀个绑定的key, 而是根据消息的RoutingKey进行判断, 只有队列绑定时的BindingKey和发送消息的RoutingKey 完全⼀致, 才会接收到消息

在这里插入图片描述

1、引入依赖


<dependencies><!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.20.0</version></dependency>
</dependencies>

2、编写配置类

package rabbitmq.constant;public class Constants {public static final String HOST = "123.57.16.61";public static final Integer PORT = 5672;public static final String USERNAME = "study";public static final String PASSWORD = "study";public static final String VIRTUAL_HOST = "bite";//路由模式public static final String DIRECT_EXCHANGE = "direct.exchange";public static final String DIRECT_QUEUE1 = "direct.queue1";public static final String DIRECT_QUEUE2 = "direct.queue2";
}

3、编写生产者代码

package rabbitmq.direct;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 {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost(Constants.HOST);connectionFactory.setPort(Constants.PORT);connectionFactory.setUsername(Constants.USERNAME);connectionFactory.setPassword(Constants.PASSWORD);connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST);Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//声明交换机/*** 交换机名称,交换机类型,开启可持久化(关机数据不会丢失)*/channel.exchangeDeclare(Constants.DIRECT_EXCHANGE, BuiltinExchangeType.DIRECT, true);//声明队列//queueDeclare 队列声明channel.queueDeclare(Constants.DIRECT_QUEUE1, true, false, false, null);channel.queueDeclare(Constants.DIRECT_QUEUE2, true, false, false, null);//交换机和队列进行绑定channel.queueBind(Constants.DIRECT_QUEUE1, Constants.DIRECT_EXCHANGE, "a");channel.queueBind(Constants.DIRECT_QUEUE2, Constants.DIRECT_EXCHANGE, "a");channel.queueBind(Constants.DIRECT_QUEUE2, Constants.DIRECT_EXCHANGE, "b");channel.queueBind(Constants.DIRECT_QUEUE2, Constants.DIRECT_EXCHANGE, "c");//发布消息String msg_a = "hello direct, my routingkey is a...";//basicPublish (基础发布)channel.basicPublish(Constants.DIRECT_EXCHANGE, "", null, msg_a.getBytes());String msg_b = "hello direct, my routingkey is b...";channel.basicPublish(Constants.DIRECT_EXCHANGE, "", null, msg_b.getBytes());String msg_c = "hello direct, my routingkey is c...";channel.basicPublish(Constants.DIRECT_EXCHANGE, "", null, msg_c.getBytes());System.out.println("消息发送成功!!!");//关闭资源channel.close();connection.close();}
}

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

4、编写消费者代码

消费者1:

package rabbitmq.direct;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 {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost(Constants.HOST);connectionFactory.setPort(Constants.PORT);connectionFactory.setUsername(Constants.USERNAME);connectionFactory.setPassword(Constants.PASSWORD);connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST);Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//声明队列//queueDeclare 队列声明 (也可以省略)channel.queueDeclare(Constants.DIRECT_QUEUE1, true, false, false, null);//消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("接收到消息:" + new String(body));}};channel.basicConsume(Constants.DIRECT_QUEUE1,true,consumer);}
}

在这里插入图片描述

消费者2:

package rabbitmq.direct;import com.rabbitmq.client.*;
import rabbitmq.constant.Constants;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Consumer2 {public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost(Constants.HOST);connectionFactory.setPort(Constants.PORT);connectionFactory.setUsername(Constants.USERNAME);connectionFactory.setPassword(Constants.PASSWORD);connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST);Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//声明队列//queueDeclare 队列声明 (也可以省略)channel.queueDeclare(Constants.DIRECT_QUEUE2, true, false, false, null);//消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("接收到消息:" + new String(body));}};channel.basicConsume(Constants.DIRECT_QUEUE2,true,consumer);}
}

在这里插入图片描述

三、Topics (通配符模式)

Topics 和Routing模式的区别是:

  1. topics 模式使用的交换机类型为topic(Routing模式使用的交换机类型为direct)
  2. topic 类型的交换机在匹配规则上进行了扩展, Binding Key⽀持通配符匹配(direct类型的交换机路由规则是BindingKey和RoutingKey完全匹配)

在这里插入图片描述

在topic类型的交换机在匹配规则上, 有些要求:

  1. RoutingKey 是⼀系列由点( . )分隔的单词, ⽐如 " stock.usd.nyse ", " nyse.vmw ",
    " quick.orange.rabbit "
  2. BindingKey 和RoutingKey⼀样, 也是点( . )分割的字符串.
  3. Binding Key中可以存在两种特殊字符串, 用于模糊匹配
  • * 表⽰⼀个单词 # 表⽰多个单词(0-N个)
    

比如:
• Binding Key 为"d.a.b" 会同时路由到Q1 和Q2
• Binding Key 为"d.a.f" 会路由到Q1
• Binding Key 为"c.e.f" 会路由到Q2
• Binding Key 为"d.b.f" 会被丢弃, 或者返回给⽣产者(需要设置mandatory参数)

1、引入依赖


<dependencies><!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.20.0</version></dependency>
</dependencies>

2、编写配置类

package rabbitmq.constant;public class Constants {public static final String HOST = "123.57.16.61";public static final Integer PORT = 5672;public static final String USERNAME = "study";public static final String PASSWORD = "study";public static final String VIRTUAL_HOST = "bite";//通配符模式public static final String TOPIC_EXCHANGE = "topic.exchange";public static final String TOPIC_QUEUE1 = "topic.queue1";public static final String TOPIC_QUEUE2 = "topic.queue2";

3、编写生产者代码

package rabbitmq.topic;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 {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost(Constants.HOST);connectionFactory.setPort(Constants.PORT);connectionFactory.setUsername(Constants.USERNAME);connectionFactory.setPassword(Constants.PASSWORD);connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST);Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//声明交换机/*** 交换机名称,交换机类型,开启可持久化(关机数据不会丢失)*/channel.exchangeDeclare(Constants.TOPIC_EXCHANGE, BuiltinExchangeType.TOPIC, true);//声明队列//queueDeclare 队列声明channel.queueDeclare(Constants.TOPIC_QUEUE1, true, false, false, null);channel.queueDeclare(Constants.TOPIC_QUEUE2, true, false, false, null);//交换机和队列进行绑定channel.queueBind(Constants.TOPIC_QUEUE1, Constants.TOPIC_EXCHANGE, "*.a.*");channel.queueBind(Constants.TOPIC_QUEUE2, Constants.TOPIC_EXCHANGE, "*.*.b");channel.queueBind(Constants.TOPIC_QUEUE2, Constants.TOPIC_EXCHANGE, "c.#");//发布消息String msg_a = "hello topic, my routingkey is ae.a.f...";//basicPublish (基础发布)channel.basicPublish(Constants.TOPIC_EXCHANGE, "ae.a.f", null, msg_a.getBytes());String msg_b = "hello topic, my routingkey is ef.a.b...";channel.basicPublish(Constants.TOPIC_EXCHANGE, "ef.a.b", null, msg_b.getBytes());String msg_c = "hello topic, my routingkey is c.ef.b...";channel.basicPublish(Constants.TOPIC_EXCHANGE, "c.ef.b", null, msg_c.getBytes());System.out.println("消息发送成功!!!");//关闭资源channel.close();connection.close();}
}

4、编写消费者代码

消费者1:

package rabbitmq.topic;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 {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost(Constants.HOST);connectionFactory.setPort(Constants.PORT);connectionFactory.setUsername(Constants.USERNAME);connectionFactory.setPassword(Constants.PASSWORD);connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST);Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//声明队列//queueDeclare 队列声明 (也可以省略)channel.queueDeclare(Constants.TOPIC_QUEUE1, true, false, false, null);//消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("接收到消息:" + new String(body));}};channel.basicConsume(Constants.TOPIC_QUEUE1,true,consumer);}
}

在这里插入图片描述

消费者2:

package rabbitmq.topic;import com.rabbitmq.client.*;
import rabbitmq.constant.Constants;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Consumer2 {public static void main(String[] args) throws IOException, TimeoutException {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost(Constants.HOST);connectionFactory.setPort(Constants.PORT);connectionFactory.setUsername(Constants.USERNAME);connectionFactory.setPassword(Constants.PASSWORD);connectionFactory.setVirtualHost(Constants.VIRTUAL_HOST);Connection connection = connectionFactory.newConnection();Channel channel = connection.createChannel();//声明队列//queueDeclare 队列声明 (也可以省略)channel.queueDeclare(Constants.TOPIC_QUEUE2, true, false, false, null);//消费消息DefaultConsumer consumer = new DefaultConsumer(channel){@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("接收到消息:" + new String(body));}};channel.basicConsume(Constants.TOPIC_QUEUE2,true,consumer);}
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


http://www.hkcw.cn/article/lsnYZpwRuY.shtml

相关文章

【RabbitMQ】路由模式和通配符模式的具体实现

文章目录 路由模式创建队列和交换机生产者代码创建交换机声明队列绑定交换机和队列发送消息完整代码 消费者代码运行程序启动生产者启动消费者 通配符模式创建队列和交换机生产者代码创建交换机声明队列绑定交换机和队列发送消息完整代码 消费者代码运行程序启动生产者启动消费…

【RabbitMQ】RabbitMQ配置与交换机学习

文章目录 简介安装和部署1. 安装RabbitMQ2.创建virtual-host3. 添加依赖4.修改配置文件 WorkQueues模型1.编写消息发送测试类2.编写消息接收&#xff08;监听&#xff09;类3. 实现能者多劳 交换机Fanout交换机1.消息发送2.消息监听 Direct交换机1.消息发送2.消息接收 Topic交换…

详解RabbitMQ工作模式之发布订阅模式

目录 发布订阅模式 概念 概念介绍 特点和优势 应用场景 注意事项 代码案例 引入依赖 常量类 编写生产者代码 编写消费者1代码 运行代码 发布订阅模式 概念 RabbitMQ的发布订阅模式&#xff08;Publish/Subscribe&#xff09;是一种消息传递模式&#xff0c;它允许消…

Java操作RabbitMQ

文章目录 Spring集成RabbitMQ1. AMQP&SpringAMQP2. SpringBoot集成RabbitMQ3. 模型work模型 4.交换机Fanout交换机Direct交换机Topic交换机 5.声明式队列和交换机基于API声明基于注解声明 6.消息转换器 Spring集成RabbitMQ 1. AMQP&SpringAMQP AMQP&#xff08;高级消…

女龙队从佛山九江“扒”向世界 农村大妈划出国际范

临近端午,广东多地的河道里又开始热闹起来,特别是佛山地区的龙舟活动历史悠久。九江镇被誉为全国首个龙舟名镇,赛龙舟的传统已有300年历史。九江是典型的水乡,河网密布,几乎每个村子都有河流经过,划船出行是最便捷的交通方式。在村民眼中,龙舟不仅能聚人气,还能增强村里…

同济大学教授路秉杰逝世 建筑学界痛失“中国塔王”

著名建筑历史学家、建筑教育家路秉杰先生因病医治无效,于2025年5月29日在上海逝世,享年90岁。他生前是中国建筑学会史学分会原副理事长,同济大学建筑与城市规划学院教授及博士生导师。路秉杰出生于1935年,山东聊城人。他在中日两国建筑史、园林史以及中国伊斯兰教建筑等领域…

武汉警界科技精英万松因公牺牲 幕后英雄悄然离去

5月27日0时33分,湖北省武汉市公安局科技信息化支队警务技术四级主任万松因公牺牲,享年50岁。两天后的早晨,武昌殡仪馆告别大厅内庄严肃穆,花圈环绕,哀乐低回。他的遗属、生前亲友及同事百余人含泪忍悲,送别这位警界科技精英。5月26日早上7时30分,青年民警王国栋送完孩子…

UniGUI DBGrid 实现多选

设置unidbgrid属性添加多选框 Options —> dgRowSelect、dgCheckSelect、dgMultiSelect —> True 属性完成后&#xff0c;保存运行&#xff0c;unidbgrid前面就会出现多选框&#xff0c;多选时质检选中前面的多选框或者 shift鼠标左键 将两次点击范围内的数据全选 或是 c…

常见位运算总结

位运算 常见位运算总结位1的个数比特位计数汉明距离只出现一次的数字 常见位运算总结 位1的个数 191. 位1的个数 给定一个正整数 n&#xff0c;编写一个函数&#xff0c;获取一个正整数的二进制形式并返回其二进制表达式中 设置位 的个数&#xff08;也被称为汉明重量&#xf…

离散化算法的二分法应用

我们思考一个问题&#xff1a;其实这里的二分法回归本源也是基于下标映射的原理&#xff0c;只是实现是借助二分的形式。 在排序好的数组中对目标数值进行二分搜索&#xff0c;在 O(logn) 的时间复杂度内找到该数值是整体数据中的第几个。 具体的我们可以如下操作&#xff1a; …

字节流操作:InputStream类 读取文件的操作(三种 read 方法)

字节流操作&#xff1a;InputStream类 和 OutputStream类 文章目录 字节流操作&#xff1a;InputStream类 和 OutputStream类观前提醒&#xff1a;InputStream类 读取文件的操作&#xff08;三种 read 方法&#xff09;1. 不带参数的 read( )方法&#xff0c;返回值是&#xff…

day13 leetcode-hot100-22(链表1)

160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 1.哈希集合HashSet 思路 &#xff08;1&#xff09;将A链的所有数据存储到HashSet中。 &#xff08;2&#xff09;遍历B链&#xff0c;找到是否在A中存在。 具体代码 /*** Definition for singly-linked list.* pu…

《在人间》葛铮:以无言演绎孤独,肢体语言传递情绪

如何塑造一个全剧中几乎没有台词的角色?葛铮认为关键在于认真体验角色的内心,由心而发地去感受,在镜头前自然地表现。5月28日,他出演的高概念意象情感剧《在人间》播出,他在剧中饰演铁林一角,多数镜头中只能用肢体语言、面部表情等方式传递角色的情绪,这对葛铮来说无疑是…

【docker部署】 Windows版docker部署harbor镜像

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Windows版docker部署harbor镜像 Windows版dock…

TopCode之手撕快排

题目链接 912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 使用数组分三块的思想 i用来遍历整个数组 left用来标记<key的边界 right用来标记>key的边界 然后i进行遍历,数组就分成了四块 [l,left]<key [left1,i-1]key [i,right-1]未…

vue2使用node版本启动差异

node 14.21.3启动 无需添加去除ssl的环境变量&#xff0c;npm run dev即可 node 20.12.2 版本需要添加 SET NODE_OPTIONS–openssl-legacy-provider && "dev": "SET NODE_OPTIONS--openssl-legacy-provider && vue-cli-service serve"其…

母亲多种工具打孩子10多次被立案 强制报告制度显效

近日,司法部发布了一起未成年人法律援助典型案例。江苏省某小学老师发现学生胡某某身上有多处新旧伤痕,询问后得知胡某某因不愿意上学等问题被母亲多次殴打。老师随即按照强制报告制度要求向检察机关报告。经鉴定,胡某某挫伤面积达体表面积8%,已构成轻伤一级。随后,其母亲…

多家银行5年期定存利率跌破1.3% “存5年不如存1年”现象频现

离新一轮存款降息仅过去10天,部分中小银行存款利率开始出现剧烈调整。5月30日,多家农商行、村镇银行集体宣布下调定期存款利率。五年期整存整取利率最低降至1.20%,已低于六家国有大行、招商银行等大行1.30%的存款挂牌利率水平。“存5年不如存1年”这样的现象在中小银行中并不…

塞尔维亚一军工厂突发爆炸致7人受伤 工人制作炸药时意外引爆

当地时间30日早上7时40分,塞尔维亚军工企业“克鲁希克”位于瓦列沃市的工厂发生爆炸事故,导致7名工人受伤送医。伤者均为轻伤,已出院居家休养。事故发生在工人制作军用炸药过程中,压机上的引信被意外激活引发爆炸。有1名工人头部受伤,4人出现耳鸣症状。爆炸发生后厂区秩序…

专家解读印度“阵风”折翼背后较量 体系战斗力的较量

印巴冲突中,双方出动了大批战机进行猛烈交火。过去,印巴冲突多为地面战斗,而此次出现了大规模空中作战。这不仅是双方作战平台性能的直接较量,更是两国空战体系的深层碰撞。5月7日,印度武装部队发起代号为“朱砂”的行动,打击巴基斯坦和巴控克什米尔地区的设施。随后,巴…