一.简单模式

1.1.核心逻辑

生产者 → 队列 → 单个消费者(1:1 直连),消息被消费后自动从队列删除。

1.2.关键特性

  • 无交换器(其实使用的是默认交换机不是显示指定),直接指定队列 
  • 消息默认自动确认(autoAck),易丢失消息 

1.3.应用场景

单任务即时处理(如聊天消息、简单日志)

1.4.架构图

1.5.代码示例

        在Rabbit中,生产者发送完消息后,就结束了,之后的操作就与生产者无关了,而消费者是被动接收的,一直处于监听状态。 

  • pom依赖
        <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.20.0</version></dependency>
  • 生产者 
package com.example.demo.rabbitmq.simple;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Producer {public static void main(String[] args)throws Exception {// 创建连接工厂ConnectionFactory connectionFactory = new ConnectionFactory();//设置主机地址connectionFactory.setHost("127.0.0.1");//设置连接端口号:默认为 5672connectionFactory.setPort(5672);// 虚拟主机名称:默认为/connectionFactory.setVirtualHost("/");//设置连接用户名;默认为guestconnectionFactory.setUsername("guest");//设置连接密码;默认为guestconnectionFactory.setPassword("guest");//1 创建连接Connection connection = connectionFactory.newConnection();//创建频道Channel channel=connection.createChannel();/*** 声明(创建)队列* 如果没有一个名字叫simp1e-queue的队列,则会创建该队列,如果有则不会创建,所以该方法在确认有消息该消息队列的情况下可以省略* queue      参数1:队列名称* durable    参数2:是否定义持久化队列,当MQ重启之后还在* exclusive  参数3:是否独占本次连接。若独占,只能有一个消费者监听这个队列目Connection关闭时删除这个队列* autoDelete 参数4:是否在不使用的时候自动删除队列,也就是在没有Consumer时自动删除* arquments  参数5:队列其它参数*/channel.queueDeclare("simple_queue", true, false, false, null);//要发送的信息String message="Hello RabbitMQ!";/*** 指定消息队列* 参数1:交换机名称,如果没有指定则使用默认Default_Exchange* 参数2:路由key,简单模式可以传递队列名称* 参数3:配置信息* 参数4:消息内容*/channel.basicPublish( "","simple_queue",  null, message.getBytes());channel.close();connection.close();}
}

 生产者main方法执行日志

        如果你先启动生产者main方法,那么你可以在RabbitMQ的web页面可以看到在队列中有一条消息。如果消费者一直都是监听的,那大概率看不到,因为生产者发送消息的那一刻立马就被消费者接收了,在消息队列中就删除了。

 

  • 消费者
package com.example.demo.rabbitmq.simple;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class Consumer {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory = new ConnectionFactory();//2.设置参数factory.setHost("127.0.0.1");factory.setPort(5672);factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");//3.创建连接 ConnectionConnection connection = factory.newConnection();//4.创建channe1Channel channel = connection.createChannel();/***5.创建队列* 如果没有一个名字叫simp1e-queue的队列,则会创建该队列,如果有则不会创建,所以该方法在确认有消息该消息队列的情况下可以省略* 数1.queue:队列名称* 参数2.durab1e:是否持久化。如果持久化,则当MQ重启之后还在* 参数3.exclusive:是否独占。* 参数4.autoDelete:是否自动删除。当没有Consumer时,自动删除掉* 参数5.arguments:队列其它参数*/channel.queueDeclare("simple_queue", true, false, false, null);// 接收消息DefaultConsumer consumer=new DefaultConsumer(channel){/*** 接收到消息后,此方法将被调用* @param consumerTag 标识* @param envelope 获取一些信息,交换机,路由key...* @param properties 配置信息* @param body 数据* @throws IOException*/@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("consumerTag:"+consumerTag);System.out.println("Exchange:"+envelope.getExchange());System.out.println("RoutingKey:"+envelope.getRoutingKey());System.out.println("properties:"+properties);System.out.println("body:"+new String(body));}};// 参数1.queue:队列名称// 参数2.autoAck:是否自动确认,类似咱们发短信,发送成功会收到一个确认消息// 参数3.callback:回调对象// 消费者类似一个监听程序,主要是用来监听消息channel.basicConsume("simple_queue",true,consumer);}
}

 接收后,消息队列就是空的了。

你也可以点击上面图片中消息队列的名称simple_queue,查看下面具体详情,如下面图片。 

 

在查看消息时,注意在右上角选择页面的刷新频率。 

   

二.工作模式

2.1.核心逻辑

生产者 → 队列 → 多个消费者并行消费(1:N)。

工作模式与简单模式唯一的不同在于它有多个消费者,当队列中有消息时,多个消费者竞争,每条消息仅被一个消费者处理。

2.2.关键特性

  • 多个消费者竞争消费同一队列,默认轮询分发(Round-Robin)
  • 可配置 basicQos(prefetchCount) 实现公平分发(能者多劳)

2.3.应用场景

资源密集型任务并行处理(如文件转码、批量邮件)

2.4.架构图

2.5.代码示例

main方法启动消费者1和消费者2,当然你可以多创建几个消费者,复制简单模式中的代码即可。

修改下生产者代码,创建一个新的消息队列,并且发送10条消息

消费者1接收到的信息

 

消费者2接收到的消息

 

三.发布订阅模式

交换器类型:fanout(广播)

3.1.核心逻辑

生产者 → Fanout交换器 → 绑定队列 → 所有消费者
忽略路由键(Routing Key) ,消息复制到所有绑定队列。

3.3.关键特性

  • 一条消息被多个消费者独立消费(广播)
  • 需显式绑定队列到交换器 

3.3.应用场景

事件广播(如用户注册后同时发邮件、短信)

3.4.架构图

 如上图所示,发布订阅模式有以下特点;

  • 指定类型的交换机;
  • 多个消息队列,交换机会将一条消息发布到每一个消息队列中;
  • 每个消息队列可以有一个或者多个消费者;

3.5.代码示例

生产者代码

package com.example.demo.rabbitmq.fanout;import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Producer {private static final String EXCHANGE_NAME="test_fanout_exchange";public static void main(String[] args)throws Exception {// 创建连接工厂ConnectionFactory connectionFactory = new ConnectionFactory();//设置主机地址connectionFactory.setHost("127.0.0.1");//设置连接端口号:默认为 5672connectionFactory.setPort(5672);// 虚拟主机名称:默认为/connectionFactory.setVirtualHost("/");//设置连接用户名;默认为guestconnectionFactory.setUsername("guest");//设置连接密码;默认为guestconnectionFactory.setPassword("guest");//1 创建连接Connection connection = connectionFactory.newConnection();//创建频道Channel channel=connection.createChannel();/*** 创建交换机* 参数1:交换机名称* 参数2:交换机类型* 参数3.durable:是否持久化* 参数4.autoDelete:自动删除* 参数5.internal:内部使用,一般false* 参数6.arquments:其它参数*///这两个方法是一样的//channel.exchangeDeclare(EXCHANGE_NAME, "fanout");channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT, true, false, false, null);/*** 声明(创建)队列* 如果没有一个名字叫simp1e-queue的队列,则会创建该队列,如果有则不会创建,所以该方法在确认有消息该消息队列的情况下可以省略* queue      参数1:队列名称* durable    参数2:是否定义持久化队列,当MQ重启之后还在* exclusive  参数3:是否独占本次连接。若独占,只能有一个消费者监听这个队列目Connection关闭时删除这个队列* autoDelete 参数4:是否在不使用的时候自动删除队列,也就是在没有Consumer时自动删除* arquments  参数5:队列其它参数*/channel.queueDeclare("fanout_queue_1", true, false, false, null);channel.queueDeclare("fanout_queue_2", true, false, false, null);channel.queueDeclare("fanout_queue_3", true, false, false, null);/*** 绑定队列到交换机* 参数1:队列名称* 参数2:交换机名称* 参数3:路由key 交换机的类型为fanout,为空*/channel.queueBind("fanout_queue_1", EXCHANGE_NAME, "");channel.queueBind("fanout_queue_2", EXCHANGE_NAME, "");channel.queueBind("fanout_queue_3", EXCHANGE_NAME, "");//要发送的信息String message="Hello RabbitMQ!";/*** 指定消息队列* 参数1:交换机名称,如果没有指定则使用默认Default_Exchange* 参数2:路由key,简单模式可以传递队列名称* 参数3:配置信息* 参数4:消息内容*/channel.basicPublish( EXCHANGE_NAME,"",  null, message.getBytes());channel.close();connection.close();}
}

上面代码有以下作用:

  • 创建指定类型的交换机(如果有,不创建);
  • 创建三个消息队列(如果有,不创建);
  • 绑定交换机与消息队列;
  • 发送消息; 

运行后可在Rabbit MQ的管理页面查看到下面的内容

交换机

点击交换机名称,查看绑定关系,绑定了三个消息队列 

 

点击任何一个消息队列,你都可以看到有一条消息

 

或者你可以根据下图查看消息队列中的消息

 

如果你要查看某个队列中的具体消息,点击队列名称,找到Get messages。

如果不修改图中的任何一个选项,是不会删除队列中的消息的。者三个消息队列中,都有一条消息【Hello RabbitMQ!】这就是广播的效果

 

消费端代码 

消费端代码并没有变化,与简单模式和工作模式的没有不同,因为消费端监听的是消息队列,只需要修改消息队列名称后运行即可。

 

在上面图片中,我只创建了两个消费者,分别监听了队列1和队列2。通过下面可以看到,队列1和队列2的消息被接收了。如果你感兴趣,可以多加几个消费者,注意:一个队列可以有多个消费者。

 

四.路由模式

交换器类型:direct(精确匹配)

4.1.核心逻辑

生产者 → Direct交换器 → 匹配路由键的队列 → 消费者
路由键需与绑定键(Binding Key)完全一致

4.2.关键特性

  • 实现消息分类投递(如按日志级别分发)
  • 队列可绑定多个路由键 

4.3.应用场景

精准路由(如ERROR日志存数据库,INFO日志打印)

4.4.架构图

根据上图,路由模式有以下特点

  • 特定类型的交换机 direct;
  • 指定具体的路由,交换机根据路由将消息发送到对应的队列中;
  • 需要注意的是,交换机到队列的路由规则,可以多个。

4.5.代码示例

消费者

消费端的代码没什么不同,在这里,我创建了两个消费端,各监听一个消息队列。

生产者

package com.example.demo.rabbitmq.routing;import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;public class Producer {private static final String EXCHANGE_NAME="direct_exchange";public static void main(String[] args)throws Exception {// 创建连接工厂ConnectionFactory connectionFactory = new ConnectionFactory();//设置主机地址connectionFactory.setHost("127.0.0.1");//设置连接端口号:默认为 5672connectionFactory.setPort(5672);// 虚拟主机名称:默认为/connectionFactory.setVirtualHost("/");//设置连接用户名;默认为guestconnectionFactory.setUsername("guest");//设置连接密码;默认为guestconnectionFactory.setPassword("guest");//1 创建连接Connection connection = connectionFactory.newConnection();//创建频道Channel channel=connection.createChannel();/*** 创建交换机* 参数1:交换机名称* 参数2:交换机类型* 参数3.durable:是否持久化* 参数4.autoDelete:自动删除* 参数5.internal:内部使用,一般false* 参数6.arquments:其它参数*/channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true, false, false, null);/*** 声明(创建)队列* 如果没有一个名字叫simp1e-queue的队列,则会创建该队列,如果有则不会创建,所以该方法在确认有消息该消息队列的情况下可以省略* queue      参数1:队列名称* durable    参数2:是否定义持久化队列,当MQ重启之后还在* exclusive  参数3:是否独占本次连接。若独占,只能有一个消费者监听这个队列目Connection关闭时删除这个队列* autoDelete 参数4:是否在不使用的时候自动删除队列,也就是在没有Consumer时自动删除* arquments  参数5:队列其它参数*/channel.queueDeclare("direct_queue_1", true, false, false, null);channel.queueDeclare("direct_queue_2", true, false, false, null);/*** 绑定队列到交换机* 参数1:队列名称* 参数2:交换机名称* 参数3:路由key*/channel.queueBind("direct_queue_1", EXCHANGE_NAME, "error");channel.queueBind("direct_queue_2", EXCHANGE_NAME, "info");//要发送的信息String message="日志信息:张三调用了delete方法.错误了,目志级别error";/*** 指定消息队列* 参数1:交换机名称,如果没有指定则使用默认Default_Exchange* 参数2:路由key,简单模式可以传递队列名称* 参数3:配置信息* 参数4:消息内容*/channel.basicPublish( EXCHANGE_NAME,"error",  null, message.getBytes());channel.close();connection.close();}
}

 在上面代码中,重点在于:

  • 创建了一个交换机,类型为DIRECT;
  • 创建了两个队列;
  • 绑定交换机与队列的关系,并指定路由;发送消息时需指定交换机名称和路由key;

运行上面代码后,消费者1接收到了error消息。

修改生产者代码中的路由key,再次执行 

消费者2接收到了信息

 

五.主题模式

交换器类型:topic(模糊匹配)

5.1.核心逻辑

生产者 → Topic交换器 → 通配符匹配的队列 → 消费者
路由键支持 *(匹配一词)和 #(匹配多词),如 user.*.order

5.2.关键特性

  • 动态路由(如按用户兴趣订阅消息)
  • 绑定键格式示例:news.#(接收所有新闻)

5.3.应用场景

动态消息分发(如电商系统按用户标签推送促销)

5.4.架构图


主题模式和路由模式的区别在于,主题模式的路由key可以模糊匹配 。

将交换机的类型设置为topic类型,在绑定队列时配置路由key,可以设置模糊匹配的规则,如下图

在生产者发送消息后,交换机根据路由开始匹配,将消息发送到所有匹配的队列中。

六.头模式

交换器类型:headers(键值对匹配)

6.1.核心逻辑

生产者 → Headers交换器 → 匹配消息头的队列 → 消费者
通过 x-match 指定 all(全匹配)或 any(任一匹配)。

6.2.关键特性

  • 不依赖路由键,用消息头(Headers)路由 
  • 性能较低,极少使用 

6.3.应用场景

特殊路由需求(如按消息语言或版本过滤)

6.4.架构图

        该模式与上文中的各个模式完全不同,在头模式中,生产者不指定或创建消息队列,不绑定交换机与消息队列。这部分功能在消费者中。

在生产者中,有以下几步:

  • 声明或创建交换机;
  • 构建消息属性,指定消息头;

6.5.代码案例

消费者

在该模式中,必须先启动消费者,因为生产者没有指定消息队列,如果先启动生产者,会导致数据丢失。

package com.example.demo.rabbitmq.head;import com.rabbitmq.client.*;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;public class Consumer1 {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory = new ConnectionFactory();//2.设置参数factory.setHost("127.0.0.1");factory.setPort(5672);factory.setVirtualHost("/");factory.setUsername("guest");factory.setPassword("guest");//3.创建连接 ConnectionConnection connection = factory.newConnection();//4.创建channe1Channel channel = connection.createChannel();//5.创建交换机channel.exchangeDeclare("headers_exchange", BuiltinExchangeType.HEADERS, true, false, false, null);/***5.创建队列* 如果没有一个名字叫simp1e-queue的队列,则会创建该队列,如果有则不会创建,所以该方法在确认有消息该消息队列的情况下可以省略* 数1.queue:队列名称* 参数2.durab1e:是否持久化。如果持久化,则当MQ重启之后还在* 参数3.exclusive:是否独占。* 参数4.autoDelete:是否自动删除。当没有Consumer时,自动删除掉* 参数5.arguments:队列其它参数*/channel.queueDeclare("headers_queue_1", true, false, false, null);// 设置绑定参数(完全匹配)Map<String, Object> bindingArgs = new HashMap<>();bindingArgs.put("x-match", "all"); // 必须所有Header匹配bindingArgs.put("format", "JSON");bindingArgs.put("priority", "high");/*** 绑定队列到交换机* 参数1:队列名称* 参数2:交换机名称* 参数3:路由key 为空* 参数4:绑定参数*/channel.queueBind("headers_queue_1", "headers_exchange", "", bindingArgs);// 接收消息// 消费消息DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received (ALL match): " + message +" Headers: " + delivery.getProperties().getHeaders());};/*** 监听消息*  参数1.queue:队列名称*  参数2.autoAck:是否自动确认,类似咱们发短信,发送成功会收到一个确认消息*  参数3.callback:回调对象*  参数4.cancelCallback:取消消费的回调*  参数5.arguments:消费者其它参数*/channel.basicConsume("headers_queue_1",true,deliverCallback,consumerTag->{});}
}

生产者

package com.example.demo.rabbitmq.head;import com.rabbitmq.client.*;import java.util.HashMap;
import java.util.Map;public class Producer {private static final String EXCHANGE_NAME="headers_exchange";public static void main(String[] args)throws Exception {// 创建连接工厂ConnectionFactory connectionFactory = new ConnectionFactory();//设置主机地址connectionFactory.setHost("127.0.0.1");//设置连接端口号:默认为 5672connectionFactory.setPort(5672);// 虚拟主机名称:默认为/connectionFactory.setVirtualHost("/");//设置连接用户名;默认为guestconnectionFactory.setUsername("guest");//设置连接密码;默认为guestconnectionFactory.setPassword("guest");//1 创建连接Connection connection = connectionFactory.newConnection();//创建频道Channel channel=connection.createChannel();/*** 创建交换机* 参数1:交换机名称* 参数2:交换机类型* 参数3.durable:是否持久化* 参数4.autoDelete:自动删除* 参数5.internal:内部使用,一般false* 参数6.arquments:其它参数*/channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.HEADERS, true, false, false, null);//设置头消息Map<String, Object> headers = new HashMap<>();headers.put("format", "JSON");headers.put("priority", "high");// 构建消息属性AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder().headers(headers) //设置头消息.build();String message = "Header Exchange Test Message";/*** 指定消息队列* 参数1:交换机名称,如果没有指定则使用默认Default_Exchange* 参数2:路由key,简单模式可以传递队列名称* 参数3:配置信息* 参数4:消息内容*/channel.basicPublish( EXCHANGE_NAME,"",  properties, message.getBytes());channel.close();connection.close();}
}

 消费者接收到的消息

当然Rabbit MQ还有其它模式,如,RPC模式:远程过程调用,本质上是同步调用,和我们使用OpenFeign调用远程接口一样,有机会再说。

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

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

相关文章

【lucene】使用docvalues的案例

下面给出一段 可直接跑通 的 Lucene 8.5.0 示例代码&#xff0c;演示如何1. 建索引时为两个字段启用 DocValues&#xff08;一个 NumericDocValues&#xff0c;一个 SortedDocValues&#xff09;&#xff1b; 2. 用 IndexSearcher 按 DocValues 排序&#xff1b; 3. 用 Facet…

IntelliJ IDEA 配置 Maven 阿里云镜像加速源全流程

1. 为什么要加国内镜像源&#xff1f;国内网络访问 Maven 中央仓库经常超时、依赖下载极慢或失败。配置阿里云等国内镜像后&#xff0c;Java 项目依赖下载飞快&#xff0c;极大提升开发效率&#xff0c;是中国开发者必做优化&#xff01;2. 添加阿里云镜像源的步骤&#xff08;…

【worklist】worklist的hl7、dicom是什么关系

HL7和DICOM在Worklist系统中是互补的关系&#xff0c;它们各自承担不同的角色&#xff0c;但协同工作以实现完整的医疗信息系统集成。HL7与DICOM Worklist的关系1. 功能分工DICOM Worklist (Modality Worklist - MWL)主要用于影像设备获取患者和检查信息基于DICOM协议&#xff…

位运算-面试题01.01.判定字符是否唯一-力扣(LeetCode)

一、题目解析1、s[i]仅包含小写字母2、字符串的长度为[0&#xff0c;100]二、算法原理解法1&#xff1a;哈希表用哈希表记录s[i]的字符&#xff0c;如果有重复的&#xff0c;则返回false优化1&#xff1a;由于s[i]中只有小写字母&#xff0c;所以可以创建一个int hash[26]的数组…

wsl /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.28‘ not found

遇到的问题并没有解决&#xff0c;这个 glibc-2.28 应该是安装好了 Ubuntu18 问题描述&#xff1a;Ubuntu18 WSL 无法启动 VS Code &#xff0c;因为node版本问题 rootUbuntu18:~# code . /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.28 not found (required by /root…

Windows系统ffmpeg.dll丢失怎么办?从错误分析到永久修复的完整流程

您是否遇到过这样的情况&#xff1a;打开心爱的视频编辑软件时&#xff0c;系统突然提示无法启动此程序&#xff0c;因为计算机中丢失ffmpeg.dll&#xff1f;别担心&#xff0c;这个问题比您想象的要常见得多。作为专业的技术支持团队&#xff0c;我们已经帮助数千用户解决了类…

LaTeX 复杂图形绘制教程:从基础到进阶

系列文章目录 第一章&#xff1a;深入了解 LaTeX&#xff1a;科技文档排版的利器 第二章&#xff1a;LaTeX 下载安装保姆级教程 第三章&#xff1a;LaTeX 创建工程并生成完整文档指南 第四章&#xff1a;LaTeX 表格制作全面指南 文章目录系列文章目录前言一、​LaTeX 绘图工具…

用 Go Typed Client 快速上手 Elasticsearch —— 从建索引到聚合的完整实战

1. 准备工作 go get github.com/elastic/go-elasticsearch/v9小贴士 如果你的集群启用了安全特性&#xff0c;需要在 elasticsearch.Config 中配置 Username/Password 或 APIKey。Typed Client 通过 NewTypedClient 创建&#xff0c;内部复用 *http.Client&#xff0c;建议全局…

《义龙棒球科普》棒球是韩国的国球吗·棒球1号位

⚾ Why Baseball is Koreas NATIONAL SPORT? | KBO热血全解析 ⚾⚾ 1. 历史根源 & 情感纽带 Historical Roots & Emotional Bond美军引入 (1945后): 战后美军将棒球带入韩国&#xff0c;迅速扎根&#xff01;✨1982 KBO成立: 亚洲第二个职业棒球联盟诞生&#xff01;奥…

三坐标测量机路径规划与补偿技术:如何用算法看见微米级误差?

三坐标测量的微米级精度背后&#xff0c;是精密的路径规划算法与实时补偿技术在保驾护航。三坐标测量机的智能避撞算法保障了测量的安全与高效&#xff1b;温度补偿技术消除了环境的无形干扰&#xff1b;点云智能处理则让海量数据蜕变为精准的工程决策依据。 “智能避让路径”&…

Docker设置容器时间

一、前言前言&#xff1a;容器搭建好之后&#xff0c;容器的默认时区于本地时区不一致&#xff0c;这将导致日志文件中保存的时间为错误时间。二、操作1、进入docker 容器docker exec -it <容器名称> bash2、选择时区tzselect3、配置时区根据跳出来的配置选择Asia -> …

德国威乐集团亚太中东非洲PMO负责人和继明受邀为PMO大会主持人

全国PMO专业人士年度盛会德国威乐集团亚太中东非洲PMO负责人 和继明先生 受邀为“PMO评论”主办的2025第十四届中国PMO大会主持人&#xff0c;敬请关注&#xff01;嘉宾介绍&#xff1a;和继明先生&#xff0c;德国威乐集团亚太中东非洲PMO负责人&#xff0c;项目管理硕士MPM&a…

idea 集成飞算Java AI 教程

idea 集成飞算Java AI 教程一、介绍二、下载安装 飞算Java AI 插件方式一&#xff1a;从idea插件市场安装方式二&#xff1a;下载离线安装包三、飞算Java AI插件使用一、介绍 ​ 随着人工智能技术的发展&#xff0c;AI 编程助手逐渐成为提升开发效率的强大工具。上一篇教程是i…

2025.8.1

代码练习 //用指针访问对象成员 #include<iostream> #include<string> using namespace std; class Champion { public:Champion(int id, string nm, int hp, int mn, int dmg) {ID id;name nm;HP hp;mana mn;damage dmg;}void attack(Champion& chmp) {c…

一种新的分布式ID生成方案--ULID

一种新的分布式ID生成方案 ULID: 一种新的分布式ID生成方案 ULID (Universally Unique Lexicographically Sortable Identifier) 是一种较新的分布式ID生成方案&#xff0c;旨在解决传统UUID和雪花算法(Snowflake)的一些局限性。ULID的主要特点 可排序性&#xff1a;ULID按生成…

服务器中涉及节流(Throttle)的硬件组件及其应用注意事项

服务器中涉及节流&#xff08;Throttle&#xff09;的硬件组件及其应用注意事项 在服务器硬件中&#xff0c;“节流”&#xff08;throttling&#xff09;是一种保护机制&#xff0c;当组件温度过高、功耗过大或超出安全阈值时&#xff0c;系统会自动降低性能&#xff08;如时钟…

GitPython07-源码解读

GitPython07-源码解读1 1-核心知识 1&#xff09;从核心代码的第一行作为突破口2&#xff09;从Repo.init方法入手做追踪3&#xff09;subprocess到底做了什么&#xff1f;gitPython是不是执行的脚本&#xff0c;最终还是通过subprocess做到的4&#xff09;代码中貌似并没有实…

Java继承机制详解:从原理到实战应用

一、继承的本质&#xff1a;消除冗余&#xff0c;构建逻辑关系想象一个公司管理系统&#xff1a;普通销售员工&#xff08;CommissionEmployee&#xff09;和带底薪销售员工&#xff08;BasePlusCommissionEmployee&#xff09;共享大部分属性&#xff08;姓名、工号、销售额、…

工业数采引擎-DTU

DTU配置注册包及心跳包(对应设备配置->设备SN)&#xff0c;模块工作方式&#xff1a;TcpClient&#xff0c;首次连接成功后&#xff0c;DTU发送上来的注册包作为链路SessionId1. ModbusRtu设备 -> Dtu -> Server2. DLT645设备 -> Dtu -> Server3. 自定义设备 -&…

AttributeError: ChatGLMTokenizer has no attribute vocab_size

请问运行下面语句tokenizer AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_codeTrue) 出现“AttributeError: ChatGLMTokenizer has no attribute vocab_size”是版本不一致&#xff0c;需要旧的版本卸载conda uninstall transformers或者pip un…