ActiveMQ在Spring Boot中的詳細使用指南

?? 目錄

?? ActiveMQ簡介

什么是ActiveMQ?

核心概念

??? 基礎架構組件

?? 重要概念解釋

ActiveMQ vs 其他消息中間件

?? 環境搭建

1. ActiveMQ服務端安裝

Docker方式(推薦初學者)

手動安裝方式

2. 驗證安裝

訪問Web管理界面

連接參數

測試連接

??? Spring Boot集成配置

1. 添加依賴

2. 配置文件

3. ActiveMQ配置類

 

?? 基礎消息收發

1. 創建消息實體類

2. 消息生產者服務

3. 消息消費者服務

4. 測試控制器

?? 消息模式詳解

1. 點對點模式(Queue)

特點

實現示例

2. 發布訂閱模式(Topic)

特點

實現示例

?? 高級特性

1. 消息選擇器(Message Selector)

基于消息屬性過濾

2. 事務消息

JMS事務配置

3. 消息確認機制

手動確認模式

4. 死信隊列(DLQ)

死信隊列配置

??? Web管理界面

ActiveMQ Web Console使用

1. 訪問管理界面

2. 主要功能

隊列管理

主題管理

連接監控

消息瀏覽

2. 自定義監控頁面

創建監控控制器

創建監控頁面

?? 監控和管理

1. Spring Boot Actuator集成

添加Actuator依賴

配置監控端點

自定義健康指示器

2. 性能監控

消息處理性能監控

3. 日志配置

logback-spring.xml

?? 實戰案例

? 性能優化

?? 最佳實踐

? 常見問題解決


???????

?? ActiveMQ簡介

什么是ActiveMQ?

ActiveMQ是Apache軟件基金會開發的開源消息中間件,是Java消息服務(JMS)的完整實現,具有高性能、可靠性強、易于使用的特點。

核心概念

??? 基礎架構組件
Producer(生產者):負責發送消息
Consumer(消費者):負責接收和處理消息
Broker(代理):消息服務器,負責存儲和轉發消息
Destination(目的地):消息的目標,包括Queue和Topic
?? 重要概念解釋
  • Queue(隊列):點對點模式,一條消息只能被一個消費者消費
  • Topic(主題):發布訂閱模式,一條消息可以被多個消費者消費
  • JMS(Java Message Service):Java消息服務API標準
  • Message(消息):傳輸的數據單元
  • Session(會話):生產和消費消息的上下文
  • Connection(連接):客戶端與消息服務器的網絡連接

ActiveMQ vs 其他消息中間件

特性ActiveMQRabbitMQRocketMQ
開發語言JavaErlangJava
協議支持JMS、AMQP、STOMPAMQP自定義協議
管理界面Web ConsoleManagement UIConsole
集群支持???
事務支持???
消息持久化???

?? 環境搭建

1. ActiveMQ服務端安裝

Docker方式(推薦初學者)
# 1. 拉取ActiveMQ鏡像
docker pull webcenter/activemq:latest# 2. 啟動ActiveMQ容器
docker run -d \--name activemq \-p 61616:61616 \-p 8161:8161 \webcenter/activemq:latest# 3. 查看容器狀態
docker ps | grep activemq# 4. 查看日志
docker logs activemq
手動安裝方式
# 1. 下載ActiveMQ
wget https://archive.apache.org/dist/activemq/5.17.3/apache-activemq-5.17.3-bin.tar.gz# 2. 解壓
tar -zxvf apache-activemq-5.17.3-bin.tar.gz# 3. 啟動ActiveMQ
cd apache-activemq-5.17.3
./bin/activemq start# 4. 停止ActiveMQ
./bin/activemq stop# 5. 查看狀態
./bin/activemq status

2. 驗證安裝

訪問Web管理界面
URL: http://localhost:8161/admin
默認用戶名: admin
默認密碼: admin
連接參數
JMS連接URL: tcp://localhost:61616
Web管理端口: 8161
JMX端口: 1099
測試連接
# 使用ActiveMQ自帶的測試工具
cd apache-activemq-5.17.3# 啟動消費者
./bin/activemq consumer# 啟動生產者(新開終端)
./bin/activemq producer

??? Spring Boot集成配置

1. 添加依賴

<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot ActiveMQ Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId></dependency><!-- ActiveMQ連接池 --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-pool</artifactId></dependency><!-- JSON處理 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><!-- 開發工具 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency>
</dependencies>

2. 配置文件

application.yml
# ActiveMQ配置
spring:activemq:broker-url: tcp://localhost:61616  # ActiveMQ服務器地址user: admin                        # 用戶名password: admin                    # 密碼in-memory: false                   # 不使用內存模式pool:enabled: true                    # 啟用連接池max-connections: 50              # 最大連接數idle-timeout: 30000              # 空閑超時時間(毫秒)packages:trust-all: true                  # 信任所有包(開發環境)trusted: com.example.model       # 信任的包(生產環境推薦)# JMS配置jms:pub-sub-domain: false              # false=Queue模式,true=Topic模式template:default-destination: default-queue  # 默認目的地delivery-mode: persistent        # 消息持久化模式priority: 100                    # 消息優先級(0-255)time-to-live: 36000000          # 消息存活時間(毫秒)receive-timeout: 10000           # 接收超時時間(毫秒)# 應用配置
server:port: 8080# 日志配置
logging:level:org.apache.activemq: INFOorg.springframework.jms: DEBUGcom.example: DEBUG
application.properties(可選)
# ActiveMQ連接配置
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.in-memory=false# 連接池配置
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
spring.activemq.pool.idle-timeout=30000# JMS配置
spring.jms.pub-sub-domain=false
spring.jms.template.default-destination=default-queue
spring.jms.template.delivery-mode=persistent

3. ActiveMQ配置類

基礎配置
package com.example.config;import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.pool.PooledConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
import org.springframework.jms.support.converter.MessageType;@Configuration
@EnableJms  // 啟用JMS
public class ActiveMQConfig {@Value("${spring.activemq.broker-url}")private String brokerUrl;@Value("${spring.activemq.user}")private String username;@Value("${spring.activemq.password}")private String password;/*** ActiveMQ連接工廠*/@Beanpublic ActiveMQConnectionFactory activeMQConnectionFactory() {ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();factory.setBrokerURL(brokerUrl);factory.setUserName(username);factory.setPassword(password);// 信任所有包(開發環境)factory.setTrustAllPackages(true);// 生產環境推薦指定信任的包// factory.setTrustedPackages(Arrays.asList("com.example.model"));return factory;}/*** 連接池工廠*/@Beanpublic PooledConnectionFactory pooledConnectionFactory() {PooledConnectionFactory pooledFactory = new PooledConnectionFactory();pooledFactory.setConnectionFactory(activeMQConnectionFactory());pooledFactory.setMaxConnections(50);  // 最大連接數pooledFactory.setIdleTimeout(30000);  // 空閑超時return pooledFactory;}/*** JmsTemplate - 用于發送消息*/@Beanpublic JmsTemplate jmsTemplate() {JmsTemplate template = new JmsTemplate();template.setConnectionFactory(pooledConnectionFactory());template.setMessageConverter(jacksonJmsMessageConverter());template.setDeliveryPersistent(true);  // 消息持久化template.setSessionTransacted(true);   // 啟用事務return template;}/*** Queue模式的監聽器工廠*/@Beanpublic DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(pooledConnectionFactory());factory.setMessageConverter(jacksonJmsMessageConverter());factory.setPubSubDomain(false);  // Queue模式factory.setSessionTransacted(true);  // 啟用事務factory.setConcurrency("3-10");     // 并發消費者數量return factory;}/*** Topic模式的監聽器工廠*/@Beanpublic DefaultJmsListenerContainerFactory topicListenerContainerFactory() {DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();factory.setConnectionFactory(pooledConnectionFactory());factory.setMessageConverter(jacksonJmsMessageConverter());factory.setPubSubDomain(true);   // Topic模式factory.setSessionTransacted(true);factory.setConcurrency("3-10");return factory;}/*** 消息轉換器 - 支持對象序列化*/@Beanpublic MappingJackson2MessageConverter jacksonJmsMessageConverter() {MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();converter.setTargetType(MessageType.TEXT);  // 使用文本消息converter.setTypeIdPropertyName("_type");   // 類型標識屬性return converter;}
}

?? 基礎消息收發

1. 創建消息實體類

package com.example.model;import java.io.Serializable;
import java.time.LocalDateTime;/*** 用戶消息實體*/
public class UserMessage implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String username;private String email;private String action;private LocalDateTime timestamp;private String description;// 無參構造函數(JSON反序列化需要)public UserMessage() {}// 全參構造函數public UserMessage(Long id, String username, String email, String action, String description) {this.id = id;this.username = username;this.email = email;this.action = action;this.description = description;this.timestamp = LocalDateTime.now();}// Getter和Setter方法public Long getId() { return id; }public void setId(Long id) { this.id = id; }public String getUsername() { return username; }public void setUsername(String username) { this.username = username; }public String getEmail() { return email; }public void setEmail(String email) { this.email = email; }public String getAction() { return action; }public void setAction(String action) { this.action = action; }public LocalDateTime getTimestamp() { return timestamp; }public void setTimestamp(LocalDateTime timestamp) { this.timestamp = timestamp; }public String getDescription() { return description; }public void setDescription(String description) { this.description = description; }@Overridepublic String toString() {return "UserMessage{" +"id=" + id +", username='" + username + '\'' +", email='" + email + '\'' +", action='" + action + '\'' +", timestamp=" + timestamp +", description='" + description + '\'' +'}';}
}/*** 訂單消息實體*/
public class OrderMessage implements Serializable {private static final long serialVersionUID = 1L;private String orderId;private String userId;private String productName;private Integer quantity;private Double totalPrice;private String status;private LocalDateTime createTime;// 構造函數public OrderMessage() {}public OrderMessage(String orderId, String userId, String productName, Integer quantity, Double totalPrice, String status) {this.orderId = orderId;this.userId = userId;this.productName = productName;this.quantity = quantity;this.totalPrice = totalPrice;this.status = status;this.createTime = LocalDateTime.now();}// Getter和Setter方法省略...@Overridepublic String toString() {return "OrderMessage{" +"orderId='" + orderId + '\'' +", userId='" + userId + '\'' +", productName='" + productName + '\'' +", quantity=" + quantity +", totalPrice=" + totalPrice +", status='" + status + '\'' +", createTime=" + createTime +'}';}
}

2. 消息生產者服務

package com.example.service;import com.example.model.OrderMessage;
import com.example.model.UserMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;import javax.jms.Queue;
import javax.jms.Topic;/*** 消息生產者服務*/
@Service
public class MessageProducerService {@Autowiredprivate JmsTemplate jmsTemplate;/*** 發送簡單文本消息到Queue*/public void sendTextMessage(String queueName, String message) {try {jmsTemplate.convertAndSend(queueName, message);System.out.println("? 文本消息發送成功到Queue: " + queueName);System.out.println("   消息內容: " + message);} catch (Exception e) {System.err.println("? 文本消息發送失敗: " + e.getMessage());throw new RuntimeException("消息發送失敗", e);}}/*** 發送用戶消息對象到Queue*/public void sendUserMessage(String queueName, UserMessage userMessage) {try {jmsTemplate.convertAndSend(queueName, userMessage);System.out.println("? 用戶消息發送成功到Queue: " + queueName);System.out.println("   消息內容: " + userMessage);} catch (Exception e) {System.err.println("? 用戶消息發送失敗: " + e.getMessage());throw new RuntimeException("用戶消息發送失敗", e);}}/*** 發送訂單消息到Queue*/public void sendOrderMessage(String queueName, OrderMessage orderMessage) {try {jmsTemplate.convertAndSend(queueName, orderMessage);System.out.println("? 訂單消息發送成功到Queue: " + queueName);System.out.println("   訂單ID: " + orderMessage.getOrderId());} catch (Exception e) {System.err.println("? 訂單消息發送失敗: " + e.getMessage());throw new RuntimeException("訂單消息發送失敗", e);}}/*** 發送消息到Topic(發布訂閱模式)*/public void sendMessageToTopic(String topicName, Object message) {try {// 臨時設置為Topic模式jmsTemplate.setPubSubDomain(true);jmsTemplate.convertAndSend(topicName, message);// 恢復Queue模式jmsTemplate.setPubSubDomain(false);System.out.println("? 消息發布成功到Topic: " + topicName);System.out.println("   消息內容: " + message);} catch (Exception e) {System.err.println("? Topic消息發送失敗: " + e.getMessage());throw new RuntimeException("Topic消息發送失敗", e);}}/*** 發送帶優先級的消息*/public void sendPriorityMessage(String queueName, String message, int priority) {try {jmsTemplate.convertAndSend(queueName, message, messagePostProcessor -> {messagePostProcessor.setJMSPriority(priority);return messagePostProcessor;});System.out.println("? 優先級消息發送成功: 優先級=" + priority);System.out.println("   消息內容: " + message);} catch (Exception e) {System.err.println("? 優先級消息發送失敗: " + e.getMessage());}}/*** 發送延時消息*/public void sendDelayMessage(String queueName, String message, long delayTime) {try {jmsTemplate.convertAndSend(queueName, message, messagePostProcessor -> {messagePostProcessor.setLongProperty("AMQ_SCHEDULED_DELAY", delayTime);return messagePostProcessor;});System.out.println("? 延時消息發送成功: 延時=" + delayTime + "毫秒");System.out.println("   消息內容: " + message);} catch (Exception e) {System.err.println("? 延時消息發送失敗: " + e.getMessage());}}/*** 批量發送消息*/public void sendBatchMessages(String queueName, String messagePrefix, int count) {try {for (int i = 1; i <= count; i++) {String message = messagePrefix + " #" + i;jmsTemplate.convertAndSend(queueName, message);}System.out.println("? 批量消息發送成功: " + count + " 條消息");} catch (Exception e) {System.err.println("? 批量消息發送失敗: " + e.getMessage());}}
}

3. 消息消費者服務

package com.example.service;import com.example.model.OrderMessage;
import com.example.model.UserMessage;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage;/*** 消息消費者服務*/
@Service
public class MessageConsumerService {/*** 消費文本消息 - Queue模式*/@JmsListener(destination = "text.queue")public void receiveTextMessage(String message) {try {System.out.println("?? 接收到文本消息: " + message);// 模擬業務處理processTextMessage(message);System.out.println("? 文本消息處理完成");} catch (Exception e) {System.err.println("? 文本消息處理失敗: " + e.getMessage());throw new RuntimeException("消息處理失敗", e);}}/*** 消費用戶消息對象 - Queue模式*/@JmsListener(destination = "user.queue")public void receiveUserMessage(UserMessage userMessage) {try {System.out.println("?? 接收到用戶消息: " + userMessage);// 根據用戶行為進行不同處理switch (userMessage.getAction().toLowerCase()) {case "register":handleUserRegistration(userMessage);break;case "login":handleUserLogin(userMessage);break;case "logout":handleUserLogout(userMessage);break;case "update":handleUserUpdate(userMessage);break;default:System.out.println("?? 未知的用戶行為: " + userMessage.getAction());}System.out.println("? 用戶消息處理完成");} catch (Exception e) {System.err.println("? 用戶消息處理失敗: " + e.getMessage());throw new RuntimeException("用戶消息處理失敗", e);}}/*** 消費訂單消息 - Queue模式*/@JmsListener(destination = "order.queue")public void receiveOrderMessage(OrderMessage orderMessage) {try {System.out.println("?? 接收到訂單消息: " + orderMessage);// 根據訂單狀態進行處理switch (orderMessage.getStatus().toLowerCase()) {case "created":handleOrderCreated(orderMessage);break;case "paid":handleOrderPaid(orderMessage);break;case "shipped":handleOrderShipped(orderMessage);break;case "completed":handleOrderCompleted(orderMessage);break;case "cancelled":handleOrderCancelled(orderMessage);break;default:System.out.println("?? 未知的訂單狀態: " + orderMessage.getStatus());}System.out.println("? 訂單消息處理完成");} catch (Exception e) {System.err.println("? 訂單消息處理失敗: " + e.getMessage());throw new RuntimeException("訂單消息處理失敗", e);}}/*** 消費Topic消息 - 發布訂閱模式* 多個消費者可以同時接收到同一條消息*/@JmsListener(destination = "news.topic", containerFactory = "topicListenerContainerFactory")public void receiveNewsFromTopic(String news) {try {System.out.println("?? [新聞訂閱者1] 接收到新聞: " + news);// 處理新聞消息processNews(news, "訂閱者1");System.out.println("? [新聞訂閱者1] 新聞處理完成");} catch (Exception e) {System.err.println("? [新聞訂閱者1] 新聞處理失敗: " + e.getMessage());}}/*** 另一個Topic消費者*/@JmsListener(destination = "news.topic", containerFactory = "topicListenerContainerFactory")public void receiveNewsFromTopic2(String news) {try {System.out.println("?? [新聞訂閱者2] 接收到新聞: " + news);// 處理新聞消息processNews(news, "訂閱者2");System.out.println("? [新聞訂閱者2] 新聞處理完成");} catch (Exception e) {System.err.println("? [新聞訂閱者2] 新聞處理失敗: " + e.getMessage());}}/*** 消費原始JMS消息(可以獲取更多消息屬性)*/@JmsListener(destination = "raw.message.queue")public void receiveRawMessage(Message message) {try {if (message instanceof TextMessage) {TextMessage textMessage = (TextMessage) message;String content = textMessage.getText();// 獲取消息屬性String messageId = message.getJMSMessageID();int priority = message.getJMSPriority();long timestamp = message.getJMSTimestamp();System.out.println("

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

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

相關文章

二元一次方程

前言 最近剛學二元一次方程&#xff0c;想寫一篇專欄熟悉一下本文寫給初一的同學看&#xff0c;學過的就劃了吧二元一次方程 兩個未知數最高項次數為 111 次為整式方程二元一次方程的解不唯一&#xff0c;但是二元一次方程可以用一個未知數來表達另一個未知數eg:eg:eg: xy1x y…

AI編程的未來是智能體原生開發?

目錄 前言 一、從“串行”到“并行”&#xff1a;什么是智能體原生開發&#xff1f; 1.1 傳統模式&#xff08;串行思維&#xff09; 1.2 智能體原生模式&#xff08;并行思維&#xff09; 二、程序員的新角色&#xff1a;從代碼手藝人到系統思想家 三、軟件開發的終局&a…

【牛客刷題】小紅的與運算

文章目錄 一、題目介紹1.1 題目描述1.2 輸入描述1.3 輸出描述1.4 示例二、 解題思路2.1 核心算法設計2.2 性能優化關鍵2.3 算法流程圖三、解法實現3.1 解法一:基礎實現3.1.1 初級版本分析3.2 解法二:優化版本(推薦)3.2.1 優化版本分析四、總結與拓展4.1 關鍵優化技術4.2 算…

spring中 方法上@Transation實現原理

Spring中Transactional注解方法實現原理Spring的Transactional注解在方法級別實現事務管理的原理主要基于動態代理和攔截器機制&#xff0c;以下是其核心實現流程&#xff1a;1. 代理創建階段當Spring容器啟動時&#xff0c;會為帶有Transactional注解的類創建代理對象&#xf…

qt-C++語法筆記之Stretch與Spacer的關系分析

qt-C語法筆記之Stretch與Spacer的關系分析 code review! 文章目錄qt-C語法筆記之Stretch與Spacer的關系分析1. Stretch&#xff08;拉伸因子&#xff09;2. Horizontal Spacer 和 Vertical Spacer3. Stretch 和 Spacer 的關系4. 實際應用中的選擇5. 注意事項6. 代碼與 Qt Desig…

Qwen3技術綜述

1. 引入 2025年5月&#xff0c;qwen推出了旗艦模型&#xff08;flagship model&#xff09;Qwen3-235B-A22B。并以Apache 2.0版權發布&#xff08;可自由商業使用&#xff0c;修改代碼和商用要包含原始版權&#xff09;。本文對其技術報告中提到的數據處理技術與模型結構進行綜…

[特殊字符] Excel 讀取收件人 + Outlook 批量發送帶附件郵件 —— Python 自動化實戰

許多公司定期需要將不同部門或客戶的報告發送給指定人員。手動操作容易出錯、耗時且繁瑣。今天這篇文章教你如何利用 Python 實現&#xff1a; &#x1f9e9; 從 Excel 中讀取“收件人 抄送人 附件文件路徑”&#xff1b; &#x1f4e4; 使用 win32com.client 調用 Outlook …

多模態大語言模型arxiv論文略讀(152)

VidComposition: Can MLLMs Analyze Compositions in Compiled Videos? ?? 論文標題&#xff1a;VidComposition: Can MLLMs Analyze Compositions in Compiled Videos? ?? 論文作者&#xff1a;Yunlong Tang, Junjia Guo, Hang Hua, Susan Liang, Mingqian Feng, Xinya…

基于AR和SLAM技術的商場智能導視系統技術原理詳解

本文面對室內定位算法工程師、智慧商場系統開發者、對VR/AR應用開發感興趣的技術人員&#xff0c;解決如何通過SLAMAR技術破解大型商場室內導航的空間認知壁壘&#xff0c;實現沉浸式導覽&#xff0c;本文提供完整技術方案與代碼實現。 如需獲取商場智能導視系統解決方案請前往…

Debezium日常分享系列之:認識Debezium Operator

Debezium日常分享系列之&#xff1a;認識Debezium Operator什么是Debezium OperatorDebezium Operator 的工作原理Debezium Operator 的優點Debezium Operator 使用場景Debezium Operator 的關鍵組件部署Debezium OperatorDebezium Operator 的使用什么是Debezium Operator De…

POSIX信號量,環形隊列

是一種進程間或線程間同步機制&#xff0c;用于控制多個線程/進程對共享資源的訪問&#xff0c;避免并發沖突。可以看作是一個計數器&#xff0c;通過對計數器的操作&#xff08;PV操作&#xff09;實現同步P操作(原子性)&#xff1a;&#xff0d;&#xff0d;&#xff0c;將信…

Python Day6

浙大疏錦行 Python Day6 內容&#xff1a; 描述性統計&#xff08;可視化分析&#xff09;單特征可視化&#xff08;連續、離散&#xff09;特征與標簽可視化特征與特征可視化 代碼&#xff1a; # TODO: 描述性統計 import pandas as pd import numpy as np import seaborn…

ESP32與樹莓派C++、Rust開發實戰

C++語言在ESP32、樹莓派實例 以下是關于C++語言在ESP32、樹莓派等硬件設備上的開發實例匯總,涵蓋常見應用場景和代碼示例。 ESP32開發實例 LED控制(GPIO操作) 使用ESP32的GPIO控制LED燈,示例代碼基于Arduino框架: #include <Arduino.h> const int ledPin = 2; …

Jedis 原生之道:Redis 命令 Java 實現指南(一)

Hi~&#xff01;這里是奮斗的明志&#xff0c;很榮幸您能閱讀我的文章&#xff0c;誠請評論指點&#xff0c;歡迎歡迎 ~~ &#x1f331;&#x1f331;個人主頁&#xff1a;奮斗的明志 &#x1f331;&#x1f331;所屬專欄&#xff1a;Redis &#x1f4da;本系列文章為個人學習筆…

飛算 JavaAI 開發助手:深度學習驅動下的 Java 全鏈路智能開發新范式

飛算 JavaAI 開發助手&#xff1a;深度學習驅動下的 Java 全鏈路智能開發新范式 文章目錄飛算 JavaAI 開發助手&#xff1a;深度學習驅動下的 Java 全鏈路智能開發新范式前言飛算 JavaAI IDEA插件下載、注冊、使用智能引導操作流程Java Chat智能工作流程操作流程智能問答操作流…

Spring Boot 核心特性與版本演進解析

深度解讀自動配置原理、版本差異與 3.x 的顛覆性變革 一、Spring Boot 的核心理念與迭代主線 Spring Boot 用兩大核心武器重構了 Java 開發范式&#xff1a; 嵌入式容器&#xff1a;終結了 “war 包 Tomcat 配置地獄”&#xff0c;讓 java -jar 成為生產級部署的標準姿勢自動…

React Tailwind css 大前端考試、問卷響應式模板

功能概述 基于 React 和 Tailwind CSS 開發的在線大前端知識考試系統。頁面設計簡潔美觀&#xff0c;交互流暢&#xff0c;適合前端開發者、學習者進行自我測試和知識鞏固。系統內置多道涵蓋 React、CSS、JavaScript、HTTP 等前端核心知識點的題目&#xff0c;支持單選與多選題…

【前端】手寫代碼匯總

近期更新完&#xff0c;后面不定期更新&#xff0c;建議關注收藏點贊。 目錄快排手寫防抖節流數組扁平化&#xff08;要求使用 reduce 方法&#xff09;數組filter實現手寫一個加載圖片的函數 loadImage手寫Promise then手寫 Promise.All手寫 Promise.race手寫allsettled手寫us…

基于MATLAB 的心電信號去噪

基于Matlab的心電信號去噪 generate.m , 3450 genR.m , 953 genU.m , 891 get_obs.m , 957 CHANGELOG , 11185 find_localobs.m , 2312 fmain.m , 2272

git branch -a 還有一些已經刪除了的分支

如何處理已經刪除的遠程跟蹤分支1、刪除遠程跟蹤分支如果你確定某個遠程跟蹤分支不再需要&#xff0c;你可以使用 git branch -d -r 命令來刪除它。例如&#xff0c;要刪除名為 origin/test 的遠程跟蹤分支&#xff0c;你可以使用&#xff1a;git branch -d -r origin/test2、更…