Rabbit MQ的消息模式-Java原生代碼

一.簡單模式

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…