JMS 消息隊列接口基本使用指南

概述

介紹

JMS(Java Message Service)即 Java 消息服務應用程序接口,是一個 Java 平臺中關于面向消息中間件(MOM)的 API,用于在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。Java 消息服務是一個與具體平臺無關的 API,絕大多數 MOM 提供商都對JMS 提供支持。

簡短來說,JMS 是一種與廠商無關的 API,是 sun 公司為了統一廠商的接口規范,而定義出的一組api接口,用來訪問消息收發系統消息。它類似于 JDBC(Java Database Connectivity),提供了應用程序之間異步通信的功能。


JMS 體系結構

  • JMS 提供者(JMS 的實現者,比如 activemq、jbossmq、tonglinkmq 等)
  • JMS 客戶(使用提供者發送消息的程序或對象,例如在 12306 中,負責發送一條購票消息到處理隊列中,用來解決購票高峰問題,那么,發送消息到隊列的程序和從隊列獲取消息的程序都叫做客戶)
  • JMS 生產者(producer、sender):負責創建并發送消息的客戶
  • JMS 消費者(customer、listener):負責接收并處理消息的客戶
  • JMS 消息(message):在 JMS 客戶之間傳遞數據的對象
  • JMS 隊列(queue):一個容納那些被發送的等待閱讀的消息的區域
  • JMS 主題(topic):一種支持發送消息給多個訂閱者的機制

JMS 對象模型

  • 連接工廠(connectionFactory)客戶端使用 JNDI 查找連接工廠,然后利用連接工廠創建一個 JMS 連接
  • JMS 連接:表示 JMS 客戶端和服務器端之間的一個活動的連接,是由客戶端通過調用連接工廠的方法建立的
  • JMS 會話:session 標識 JMS 客戶端和服務端的會話狀態。會話建立在 JMS 連接上,標識客戶與服務器之間的一個會話進程。
  • JMS 目的(Destination): 又稱為消息隊列,是實際的消息源
  • 生產者和消費者
  • 消息類型:分為隊列類型(優先先進先出)以及訂閱類型

消息監聽器

MessageListener

MessageListener 是最原始的消息監聽器,它是 JMS 規范中定義的一個接口。其中定義了一個用于處理接收到的消息的 onMessage() 方法,該方法只接收一個 Message 參數。

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;public class ConsumerMessageListener implements MessageListener {public void onMessage(Message message) {// 若生產者發送的是一個純文本消息,可以直接進行強制轉換,或者直接把onMessage方法的參數改成Message的子類TextMessageTextMessage textMsg = (TextMessage) message;System.out.println("接收到一個純文本消息。");try {System.out.println("消息內容是:" + textMsg.getText());} catch (JMSException e) {e.printStackTrace();}}
}

SessionAwareMessageListener

SessionAwareMessageListener 是 Spring 提供的,它不是標準的 JMS MessageListener。

MessageListener 的設計只是純粹用來接收消息的,假如在使用 MessageListener 處理接收到的消息時需要發送一個消息通知對方已經收到這個消息了,那么這個時候就需要在代碼里面去重新獲取一個 Connection 或 Session。而 SessionAwareMessageListener 的設計就是為了方便在接收到消息后發送一個回復的消息,它同樣提供了一個處理接收到的消息的 onMessage() 方法,但是這個方法可以同時接收兩個參數,一個是表示當前接收到的消息Message,另一個就是可以用來發送消息的 Session 對象。

使用 SessionAwareMessageListener 監聽器,可以在監聽并消費了消息后,不用重新獲取一個 Connection 或 Session,而是直接向原 Connection 或 Session 的某一個隊列發送消息。

代碼示例:

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.springframework.jms.listener.SessionAwareMessageListener;public class ConsumerSessionAwareMessageListener implements SessionAwareMessageListener {private Destination destination;public void onMessage(TextMessage message, Session session) throws JMSException {System.out.println("收到一條消息");System.out.println("消息內容是:" + message.getText());MessageProducer producer = session.createProducer(destination);Message textMessage = session.createTextMessage("ConsumerSessionAwareMessageListener。。。");producer.send(textMessage);}public Destination getDestination() {returndestination;}public void setDestination(Destination destination) {this.destination = destination;}
}

說明:定義了一個 SessionAwareMessageListener,在這個 Listener 中在接收到了一個消息之后,利用對應的 Session 創建了一個到 destination 的生產者和對應的消息,然后利用創建好的生產者發送對應的消息。


MessageListenerAdapter

MessageListenerAdapter 類實現了 MessageListener 接口和 SessionAwareMessageListener 接口,它的主要作用是將接收到的消息進行類型轉換,然后通過反射的形式把它交給一個普通的 Java 類進行處理。

  • MessageListenerAdapter 會把接收到的消息做如下轉換:

    • TextMessage 轉換為 String 對象
    • BytesMessage 轉換為 byte 數組
    • MapMessage 轉換為 Map 對象
    • ObjectMessage 轉換為對應的 Serializable 對象

    代碼示例:

    // 目標處理器類
    public class ConsumerListener {  public void handleMessage(String message) {  System.out.println("ConsumerListener通過handleMessage接收到一個純文本消息,消息內容是:" + message);  }  public void receiveMessage(String message) {  System.out.println("ConsumerListener通過receiveMessage接收到一個純文本消息,消息內容是:" + message);  }  
    }  
    
    <!-- 消息監聽適配器 -->  
    <bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">  <property name="delegate">  <bean class="com.tiantian.springintejms.listener.ConsumerListener"/>  </property>  <property name="defaultListenerMethod" value="receiveMessage"/>  
    </bean>  <!-- 消息監聽適配器對應的監聽容器 -->  
    <bean id="messageListenerAdapterContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">  <property name="connectionFactory" ref="connectionFactory"/>  <property name="destination" ref="adapterQueue"/>  <!-- 使用MessageListenerAdapter來作為消息監聽器 -->  <property name="messageListener" ref="messageListenerAdapter"/>
    </bean>  
    

    注意:

    • MessageListenerAdapter 會把接收到的消息做一個類型轉換,然后利用反射把它交給真正的目標處理器:一個普通的 Java 類(ConsumerListener)進行處理。

      如果真正的目標處理器是一個 MessageListener 或者是一個 SessionAwareMessageListener,那么 Spring 將直接使用接收到的Message 對象作為參數調用它們的 onMessage 方法,而不會再利用反射去進行調用。

      故在定義一個 MessageListenerAdapter 的時候就需要為它指定這樣一個目標類。這個目標類可以通過 MessageListenerAdapter 的構造方法參數指定,也可以通過它的 delegate 屬性來指定。

  • MessageListenerAdapter 另外一個主要的功能是可以通過 MessageListenerAdapter 注入的 handleMessage 方法自動的發送返回消息。

    當用于處理接收到的消息的方法(默認是 handleMessage)的返回值不為空(null或者void)的時候,Spring 會自動將它封裝為一個 JMS Message,然后自動進行回復。這個回復消息將發送到的地址主要有兩種方式可以指定:

    • 可以通過發送的 Message 的 setJMSReplyTo 方法指定該消息對應的回復消息的目的地
    • 通過 MessageListenerAdapter 的 defaultResponseDestination 屬性來指定

基本使用

依賴

<!-- jms -->
<dependency><groupId>javax.jms</groupId><artifactId>javax.jms-api</artifactId>
</dependency>
<!-- spring jms -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-jms</artifactId>
</dependency><!-- tonglinkMq jms api -->
<dependency><groupId>com.tongtech.tlq</groupId><artifactId>TongJMS-without-atomikos</artifactId><version>8.1.0-SNAPSHOT</version>
</dependency>

SpringBoot 集成 jms

jms 配置類

import org.springframework.jms.connection.CachingConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter;
import org.springframework.jms.core.JmsOperations;
import org.springframework.jms.core.JmsTemplate;
import org.tongtech.tmqi.ConnectionFactory;@EnableJms	// 聲明對 JMS 注解的支持
@Configuration
public class TestCreator {private String host;private Integer port;private String queueManager;private String channel;private String username;private String password;private int ccsid;private String queueName;private long receiveTimeout;// 配置連接工廠(tonglinkMq)@Beanpublic ConnectionFactory connectionFactory() throws JMSException {ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setProperty("tmqiAddressList", "tlq://127.0.0.1:10024");connectionFactory.setProperty("tmqiDefaultUsername", "admin");connectionFactory.setProperty("tmqiDefaultPassword", "123456");return connectionFactory;}// 配置緩存連接工廠 不配置該類則每次與MQ交互都需要重新創建連接,大幅降低速度。@Bean@Primarypublic CachingConnectionFactory cachingConnectionFactory(ConnectionFactory connectionFactory) {CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();cachingConnectionFactory.setTargetConnectionFactory(connectionFactory);cachingConnectionFactory.setSessionCacheSize(500);cachingConnectionFactory.setReconnectOnException(true);return cachingConnectionFactory;}// 配置DefaultJmsListenerContainerFactory, 用@JmsListener注解來監聽隊列消息時,尤其存在多個監聽的時候,通過實例化配置DefaultJmsListenerContainerFactory來控制消息分發@Bean(name = "jmsQueueListenerCF")public DefaultJmsListenerContainerFactory jmsQueueListenerContainerFactory(CachingConnectionFactory cachingConnectionFactory) {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(cachingConnectionFactory);// 設置連接數。如果對消息消費有順序要求,這里建議設置為"1-1"// 注:使用同一個監聽工廠類監聽多個隊列時,連接數需大于等于監聽隊列數factory.setConcurrency("3-10");	// 下限-上限// 重連間隔時間factory.setRecoveryInterval(1000L);// factory.setPubSubDomain(true);	// 支持發布訂閱功能(topic)// factory.setConcurrency("1"); 	// topic 模式,并發必須設置為1,不然一條消息可能會被消費多次return factory;}// 配置JMS模板,實例化jmsTemplate后,可以在方法中通過@autowired的方式注入模板,用方法調用發送/接收消息// 注:如果只是接收消息,可以不配置此步@Beanpublic JmsTemplate jmsQueueTemplate(CachingConnectionFactory cachingConnectionFactory) {JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);jmsTemplate.setReceiveTimeout(receiveTimeout); // 設置超時時間// jmsTemplate.setPubSubDomain(true);	// 開啟發布訂閱功能(topic)return jmsTemplate;}
}

發送消息

public class jmsUtil {@Autowiredprivate JmsTemplate jmsQueueTemplate;/*** 發送原始消息 Message*/public void send(){jmsQueueTemplate.send("queue1", new MessageCreator() {@Overridepublic Message createMessage(Session session) throws JMSException {return session.createTextMessage("我是原始消息");}});}/*** 發送消息自動轉換成原始消息* 注:關于消息轉換,還可以通過實現MessageConverter接口來自定義轉換內容*/public void convertAndSend(){jmsQueueTemplate.convertAndSend("queue1", "我是自動轉換的消息");}
}

監聽接收消息

采用注解 @JmsListener 來設置監聽方法

@Slf4j
@Component
// 此處繼承MessageListenerAdapter非必需。但若只使用@JmsListener注解監聽,可能會出現監聽消息獲取不及時或者獲取不到消息的情況,加上繼承MessageListenerAdapter后便不會出現
public class MdxpMessageListener extends MessageListenerAdapter {/*** 消息隊列監聽器* destination 隊列地址,此處使用靜態變量,支持配置化詳見下文* containerFactory 監聽器容器工廠(包含配置源), 若存在2個以上的監聽容器工廠,需進行指定*/@Override@JmsListener(destination = "TEST_QUEUE",containerFactory = "jmsQueueListenerCF")public void onMessage(Message message) {// JmsListener收到消息后,會自動封裝成自己特有的數據格式,需要自行根據消息類型解析原始消息String msgText = ""; double d = 0; try { if (msg instanceof TextMessage) {    msgText = ((TextMessage) msg).getText(); } else if (msg instanceof StreamMessage) {    msgText = ((StreamMessage) msg).readString();    d = ((StreamMessage) msg).readDouble();    } else if (msg instanceof BytesMessage) {    byte[] block = new byte[1024];    ((BytesMessage) msg).readBytes(block);    msgText = String.valueOf(block);    } else if (msg instanceof MapMessage) {    msgText = ((MapMessage) msg).getString("name");    }log.info("接收消息={}", msgText);} catch (JMSException e) { log.error("消息接收異常!", e);}}@JmsListener(destination = "TEST_QUEUE2",containerFactory = "jmsQueueListenerCF")// @Payload是消費者接受生產者發送的隊列消息,將隊列中的json字符串變成對象的注解,注意填充類需要實現序列化接口public void messageListener2(@payload User user){log.info("message={}", user)}
}

@JmsListener 注解 destination 支持配置化

注入配置讀取類

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** 隊列名稱配置* 這里切記要@Data,或手動set和get*/
@Component
@Data
public class QueueNameConfig {@Value("${ibmmq.queue-test}")private String testQueue;}

隊列監聽類

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.listener.adapter.MessageListenerAdapter;
import org.springframework.stereotype.Component;
import javax.jms.Message;
import javax.jms.TextMessage;/*** MQ消費者*/
@Component
@Slf4j
public class ReceiveMessage extends MessageListenerAdapter {/*** destination:監聽的隊列名稱,使用SpEL表達式寫入* containerFactory:監聽的工廠類,為配置類中所配置的名字*/@Override@JmsListener(destination = "#{@queueNameConfig.testQueue}", containerFactory = "jmsListenerContainerFactory")public void onMessage(Message message) {TextMessage textMessage = (TextMessage) message;  //轉換成文本消息try {String text = textMessage.getText();log.info("接收信息:{}", text);} catch (Exception e) {e.printStackTrace();}}
}

javax 原生 jms

public class jmstest {public static void main(String[] args) throws Exception { // 配置工廠ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setProperty("tmqiAddressList", "tlq://127.0.0.1:10024");connectionFactory.setProperty("tmqiDefaultUsername", "admin");connectionFactory.setProperty("tmqiDefaultPassword", "123456");// 獲取連接和會話Connection mqConn = connectionFactory.createConnection(); // 創建會話。CLIENT_ACKNOWLEDGE:手動應答,AUTO_ACKNOWLEDGE:自動應答Session mqSession = mqConn.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE); // 創建隊列Queue queuemq = Session.createQueue(queueName);// 獲取消費者MessageConsumer consumer = mqSession.createConsumer(mqSession.createQueue(queueName)); // 設置監聽器consumer.setMessageListener(new MessageListener() { public void onMessage(Message msg) { // JmsListener收到消息后,會自動封裝成自己特有的數據格式,需要自行根據消息類型解析原始消息String msgText = ""; double d = 0; try { if (msg instanceof TextMessage) {msgText = ((TextMessage) msg).getText(); } else if (msg instanceof StreamMessage) {    msgText = ((StreamMessage) msg).readString();    d = ((StreamMessage) msg).readDouble();    } else if (msg instanceof BytesMessage) {    byte[] block = new byte[1024];    ((BytesMessage) msg).readBytes(block);    msgText = String.valueOf(block);    } else if (msg instanceof MapMessage) {    msgText = ((MapMessage) msg).getString("name");    }log.info("接收消息={}", msgText);// 手動應答textMessage.acknowledge();} catch (JMSException e) { log.error("消息接收異常!", e);}}}); // 啟動連接mqConn.start(); }// 獲取生產者MessageProducer producer = mqSession.createProducer(mqSession.createQueue(queueName)); // topic(廣播)模式// Topic topic = Session.createTopic(queueName);// MessageProducer producer = mqSession.createProducer(topic); producer.setDeliveryMode(DeliveryMOde.NON_PERSISTENT);producer.send(mqSession.createTexttMessage("這是一條消息"));// 關閉資源producer.close();// 斷開連接connection.close();
} 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36076.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36076.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36076.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[保研/考研機試] KY103 2的冪次方 上海交通大學復試上機題 C++實現

題目鏈接&#xff1a; KY103 2的冪次方 https://www.nowcoder.com/share/jump/437195121691999575955 描述 Every positive number can be presented by the exponential form.For example, 137 2^7 2^3 2^0。 Lets present a^b by the form a(b).Then 137 is present…

k8s containerd 配置 http訪問harbor image【最新--官方文檔】

不看官方文檔的代價&#xff1a;在搜索了很多中文資料發現配置了都不起作用&#xff0c;浪費了很多時間。 https://github.com/containerd/containerd/blob/main/docs/cri/config.md#registry-configuration The old CRI config pattern for specifying registry.mirrors and…

MySQL8安裝和刪除教程 保姆級(Windows)

下載 官網: mysql官網點擊Downloads->MySQL Community(GPL) Downloads->MySQL Community Server(或者點擊MySQL installer for Windows) Windows下有兩種安裝方式 在線安裝 一般帶有 web字樣 這個需要聯網離線安裝 一般沒有web字樣 安裝 下載好之后,版本號可以不一樣&…

Postman中,既想傳遞文件,還想傳遞多個參數(后端)

需求:既想傳文件又想傳多個參數可以用以下方式實現

Django rest_framework Serializer中的create、Views中的create/perform_create的區別

Django rest_framework Serializer中的create、Views中的create/perform_create的區別 對于后端來說&#xff0c;前后端分離的方式能讓前后端的開發都爽。和所有的爽一樣&#xff0c;每爽一次都要付出一定的代價。而前后端分離的代價&#xff0c;就是后端要面對巨量的模塊化的功…

C語言實現插入排序

什么是插入排序&#xff1f; 插入排序&#xff08;Insertion Sort&#xff09; 是一種簡單且逐步構建有序序列的排序算法。它的思想是將數組分為兩部分&#xff1a;已排序的部分和未排序的部分。初始時&#xff0c;已排序部分只包含數組的第一個元素&#xff0c;然后逐步將未排…

Process.Start 報錯

Process.Start 報錯 System.Diagnostics.Process.StartWithShellExecuteEx Process.Start 為什么會引發“系統找不到指定的文件”異常 Process.Start 報錯 找不到路徑 ,System.ComponentModel.Win32Exception:“系統找不到指定的文件。 問題1、 在WinForm中可能是權限問題&…

做了這件事,精準拿捏企業資產管理!

資產管理系統是一種為組織和個人提供管理各類資產的重要工具。無論是金融資產還是實物資產&#xff0c;這些都構成了一個實體或個人財務狀況的重要組成部分。 無論是企業尋求優化其固定資產維護&#xff0c;還是個人希望更好地管理他們的投資組合&#xff0c;資產管理系統在現代…

NZ系列工具NZ02:VBA讀取PDF使用說明

【分享成果&#xff0c;隨喜正能量】時光綻放并蒂蓮&#xff0c;更是一份殷殷囑托&#xff0c;更是一份誠摯祝福&#xff0c;是一份時光饋贈&#xff0c;又是一份時光陪伴。。 我的教程一共九套及VBA漢英手冊一部&#xff0c;分為初級、中級、高級三大部分。是對VBA的系統講解…

“深入解析JVM:探索Java虛擬機的工作原理與優化技巧“

標題&#xff1a;深入解析JVM&#xff1a;探索Java虛擬機的工作原理與優化技巧 摘要&#xff1a;本文將深入探討Java虛擬機&#xff08;JVM&#xff09;的工作原理、內部結構以及如何優化Java應用程序的性能。我們將介紹JVM的主要組件&#xff0c;包括類加載器、運行時數據區域…

關于openssl SM2 ECC以及密鑰生成和簽名驗簽

SM2是基于ECC的國密算法,本身也是ECC算法。 openssl生成ECC公私鑰并簽名驗簽 #!/bin/sh openssl ecparam -genkey -name prime256v1 -out private.pem #print pri #openssl ec -in private.pem -text -noout openssl ec -in private.pem -pubout -out public.pem #gen test.…

uniapp+uview封裝小程序請求

提要&#xff1a; uniapp項目引入uview庫 此步驟不再闡述 1.創建環境文件 env.js&#xff1a; let BASE_URL;if (process.env.NODE_ENV development) {// 開發環境BASE_URL 請求地址; } else {// 生產環境BASE_URL 請求地址; }export default BASE_URL; 2.創建請求文件 該…

QLExpress動態腳本引擎解析工具

介紹 QLExpress腳本引擎 1、線程安全&#xff0c;引擎運算過程中的產生的臨時變量都是threadlocal類型。 2、高效執行&#xff0c;比較耗時的腳本編譯過程可以緩存在本地機器&#xff0c;運行時的臨時變量創建采用了緩沖池的技術&#xff0c;和groovy性能相當。 3、弱類型腳本…

廣西Geotrust單位多域名https證書推薦

Geotrust是國際知名CA認證機構&#xff0c;根證書是Digicert&#xff0c;還有RapidSSL、QuickSSL等子品牌&#xff0c;擁有多種類型的多域名https證書&#xff0c;比如OV企業型https證書和EV增強型多域名https證書。那么&#xff0c;哪種多域名https證書更適合企事業單位使用呢…

SpringBoot復習:(43)如何以war包的形式運行SpringBoot程序

一、.pom.xml配置packging為war <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven…

Android 內存泄漏

名詞解釋 內存泄漏:即memory leak。是指內存空間使用完畢后無法被釋放的現象&#xff0c;雖然Java有垃圾回收機制&#xff08;GC&#xff09;&#xff0c;但是對于還保持著引用&#xff0c; 該內存不能再被分配使用&#xff0c;邏輯上卻已經不會再用到的對象&#xff0c;垃圾回…

react如何實現數據渲染

React數據渲染是指將組件中的數據映射到頁面上&#xff0c;以展示出來。在React中&#xff0c;數據渲染通常是通過JSX和組件的state或props完成的。 JSX是一個類似HTML的語法&#xff0c;可以在其中嵌入JavaScript表達式。在JSX中&#xff0c;可以使用{}包裹JavaScript表達式&…

解決C語言中使用scanf輸入字符串導致for循環失效的問題

在C語言編程中&#xff0c;使用scanf函數輸入字符串是一項基本操作。然而&#xff0c;當我們嘗試在for循環中使用scanf輸入字符串時&#xff0c;可能會遇到意外的問題&#xff0c;導致循環無法正常執行。本文將深入探討這個問題&#xff0c;并提供解決方案&#xff0c;讓你能夠…

考公-判斷推理-定義判斷

第九節課 例題 例題 例題 例題 例題 例題 腳一滑&#xff0c;就是工傷&#xff0c;這難道不是操作不當嗎 例題 不要較真&#xff0c;公務員&#xff0c;把沒有全局觀念的人排除在公務員隊伍之外 例題 例題 下次看到不字&#xff0c;先給我畫上 例題 例題 例題 例題…

微信群聊微信機器人實現流程

1.注冊微信賬號 要使用一個微信機器人賬號來實現在微信群聊中的自動回復功能&#xff0c;你需要注冊一個專門用于機器人的微信賬號。 注冊微信機器人賬號的步驟如下&#xff1a; 下載微信&#xff1a;在手機或者電腦上下載并安裝微信應用程序。創建新賬號&#xff1a;打開微信…