# delay-message
**Repository Path**: qiuyu97/delay-message
## Basic Information
- **Project Name**: delay-message
- **Description**: 基于springboot实现的延迟消息的starter。目前基于DelayQueue、Redission、RabbitMq实现了三种方式。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2023-05-06
- **Last Updated**: 2025-10-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Java, 延迟消息
## README
# 延迟消息解决方案 (Delay Message)
## 📋 项目介绍
Delay Message 是一个高性能、可扩展的延迟消息解决方案,提供了简单易用的API和多种实现方式,可以轻松集成到Spring Boot项目中。该框架支持三种不同的延迟消息实现方式,满足不同场景下的需求,同时具有良好的可扩展性和配置灵活性。
### 🚀 核心特性
- **多模式支持**:提供SIMPLE(内存)、RABBITMQ、REDISSON三种实现模式
- **批量操作**:支持批量发送、删除和更新延迟消息,提高处理效率
- **消息重试**:内置可配置的重试机制,增强系统可靠性
- **优雅关闭**:支持应用程序优雅关闭,避免消息丢失
- **线程池优化**:可自定义线程池配置,适应不同并发需求
- **Spring Boot自动装配**:简单配置即可快速集成
## 🏗️ 架构设计
项目采用模块化设计,主要包含以下模块:
- **delay-message-core**:核心功能实现,包含接口定义、消息模型和各模式的实现类
- **delay-message-spring-boot-starter**:Spring Boot自动配置模块,提供自动装配功能
- **delay-message-demo**:示例项目,展示如何使用该框架
## 📦 快速开始
### 1. 添加依赖
在项目的`pom.xml`文件中添加以下依赖:
```xml
com.qiuyu
delay-message-spring-boot-starter
1.0.0-SNAPSHOT
```
### 2. 定义事件枚举
创建自定义枚举实现`Event`接口,用于定义延迟事件:
```java
@Getter
@AllArgsConstructor
public enum BusinessEvent implements Event {
ORDER_PAYMENT_TIMEOUT("orderPaymentTimeout", "订单支付超时", "orderPaymentTimeoutQueue"),
EMAIL_DELAY_SEND("emailDelaySend", "邮件延迟发送", "emailDelaySendQueue"),
INVENTORY_CHECK("inventoryCheck", "库存检查", "inventoryCheckQueue");
private final String eventKey;
private final String eventDesc;
private final String queueName;
}
```
### 3. 创建消息处理器
实现`DelayMessageHandler`接口,处理特定事件的延迟消息:
```java
@Component
@Slf4j
public class OrderPaymentTimeoutHandler implements DelayMessageHandler {
@Override
public Event bind() {
return BusinessEvent.ORDER_PAYMENT_TIMEOUT;
}
@Override
public void handle(DelayMessage delayMessage) {
log.info("处理订单支付超时消息: {}", delayMessage);
// 实现订单支付超时逻辑,如取消订单、释放库存等
try {
// 处理业务逻辑
String orderId = delayMessage.getBody2Bean(String.class);
// 执行取消订单操作
} catch (Exception e) {
log.error("处理订单支付超时消息失败", e);
// 异常会被重试机制捕获并处理
}
}
}
```
### 4. 发送延迟消息
注入`DelayMessageManager`并使用它发送延迟消息:
```java
@Service
public class OrderService {
@Autowired
private DelayMessageManager delayMessageManager;
public void createOrder(Order order) {
// 创建订单逻辑
// 设置支付超时检查,30分钟后检查订单支付状态
DelayMessage delayMessage = DelayMessage.builder()
.event(BusinessEvent.ORDER_PAYMENT_TIMEOUT)
.msgId("ORDER_TIMEOUT_" + order.getId())
.body(JSONUtil.toJsonStr(order.getId()))
.build();
delayMessageManager.offer(delayMessage, 30, TimeUnit.MINUTES);
}
}
```
## ⚙️ 配置说明
在`application.yml`中进行配置:
```yaml
delay-message:
enabled: true # 是否启用延迟消息功能
mode: rabbitmq # 延迟消息模式:simple(内存), rabbitmq, redisson
thread-pool: # 线程池配置
core-pool-size: 8 # 核心线程数,默认CPU核心数*2
max-pool-size: 16 # 最大线程数,默认CPU核心数*4
queue-capacity: 500 # 队列容量
keep-alive-time: 60 # 线程空闲时间(秒)
allow-core-thread-time-out: false # 是否允许核心线程超时
retry-config: # 重试配置
enabled: true # 是否启用重试
max-retry-count: 3 # 最大重试次数
retry-interval-ms: 2000 # 重试间隔(毫秒)
# 根据选择的模式,配置相应的依赖服务
spring:
redis: # Redisson模式需要
host: 127.0.0.1
port: 6379
database: 0
rabbitmq: # RabbitMQ模式需要
host: 127.0.0.1
port: 5672
username: guest
password: guest
```
## 📚 API使用指南
### 单条消息操作
```java
// 发送延迟消息
delayMessageManager.offer(delayMessage, delayTime, timeUnit);
// 删除延迟消息
delayMessageManager.remove(delayMessage);
// 更新延迟消息的延迟时间
delayMessageManager.update(delayMessage, newDelayTime, timeUnit);
```
### 批量操作 (推荐用于高并发场景)
```java
// 批量发送具有相同延迟的消息
List messages = new ArrayList<>();
// 添加消息...
delayMessageManager.offerBatch(messages, delayTime, timeUnit);
// 批量发送具有不同延迟的消息
Map messageDelayMap = new LinkedHashMap<>();
// 添加消息和对应延迟...
delayMessageManager.offerBatch(messageDelayMap, timeUnit);
// 批量删除消息
Map removeResults = delayMessageManager.removeBatch(messages);
// 批量更新消息延迟
Map updateResults = delayMessageManager.updateBatch(messageDelayMap, timeUnit);
```
### 便捷的消息创建
```java
// 使用构建器创建消息
DelayMessage message = DelayMessage.builder()
.event(event)
.msgId("自定义消息ID")
.body("消息内容")
.build();
```
## 🔧 模式选择指南
| 模式 | 优点 | 缺点 | 适用场景 |
|------|------|------|----------|
| SIMPLE | 配置简单,无外部依赖 | 不支持持久化,仅适用于单机部署 | 开发测试环境,非关键业务 |
| RABBITMQ | 支持持久化,高可靠,分布式 | 需要部署RabbitMQ服务 | 生产环境,需要高可靠性 |
| REDISSON | 配置简单,支持分布式 | 依赖Redis,需考虑持久化配置 | 中小规模应用,Redis已作为基础设施 |
## 💡 最佳实践
1. **合理设置消息ID**:使用业务唯一标识作为消息ID,便于后续追踪和管理
2. **消息内容序列化**:建议使用JSON格式序列化复杂对象
3. **异常处理**:在处理器中适当捕获异常,避免影响整体服务
4. **资源清理**:对于不再需要的延迟消息,及时调用remove方法删除
5. **配置优化**:根据实际业务量调整线程池和重试参数
## 🤝 参与贡献
欢迎贡献代码、报告问题或提出建议:
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
## 📄 许可证
本项目采用MIT许可证。