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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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、更…