195 lines
5.4 KiB
Markdown
195 lines
5.4 KiB
Markdown
# RateLimitResetTask - 每日限流重置任务
|
||
|
||
## 任务信息
|
||
|
||
- **任务名称**: RateLimitResetTask
|
||
- **Bean 名称**: rateLimitResetTask
|
||
- **类路径**: `com.datai.integration.task.RateLimitResetTask`
|
||
- **执行方法**: `resetDailyRateLimits()`
|
||
- **模块归属**: Salesforce 集成 - 定时任务
|
||
- **创建日期**: 2026-01-16
|
||
- **最后更新**: 2026-01-16
|
||
|
||
## 功能描述
|
||
|
||
重置所有每日限流配置的使用量、剩余值和重置时间。该任务负责在每天凌晨自动重置所有每日限流配置,确保第二天可以正常使用 API 配额。
|
||
|
||
## 执行条件
|
||
|
||
无条件执行(每日定时执行)。
|
||
|
||
## 执行流程
|
||
|
||
```
|
||
开始
|
||
↓
|
||
查询所有每日限流配置(limitType = "Daily")
|
||
↓
|
||
遍历每个限流配置
|
||
↓
|
||
如果当前被阻止(isBlocked = true),解除阻止状态
|
||
↓
|
||
重置使用量为0
|
||
↓
|
||
重置剩余值为最大限制值
|
||
↓
|
||
更新重置时间为明天0点
|
||
↓
|
||
更新数据库
|
||
↓
|
||
继续下一个限流配置
|
||
↓
|
||
输出统计信息
|
||
↓
|
||
结束
|
||
```
|
||
|
||
## 执行结果统计
|
||
|
||
任务执行完成后,会输出以下统计信息:
|
||
|
||
| 统计项 | 描述 |
|
||
|--------|------|
|
||
| 重置记录数 | 成功重置的限流配置记录数量 |
|
||
|
||
## 日志输出
|
||
|
||
### INFO 级别
|
||
|
||
```
|
||
开始执行每日限流重置任务
|
||
每日限流重置任务完成,共重置 10 条记录
|
||
```
|
||
|
||
### ERROR 级别
|
||
|
||
```
|
||
执行每日限流重置任务失败
|
||
```
|
||
|
||
## 异常处理
|
||
|
||
### 任务级别异常
|
||
|
||
- 捕获所有异常,记录错误日志
|
||
- 任务执行失败时,所有限流配置都不会被重置
|
||
- 需要手动检查和修复
|
||
|
||
## 重置逻辑
|
||
|
||
### 重置的字段
|
||
|
||
| 字段名 | 重置前 | 重置后 | 说明 |
|
||
|--------|--------|--------|------|
|
||
| isBlocked | true/false | false | 解除阻止状态 |
|
||
| currentUsage | 任意值 | 0 | 重置使用量为0 |
|
||
| remainingVal | 任意值 | maxLimit | 重置剩余值为最大限制值 |
|
||
| resetTime | 任意时间 | 明天0点 | 更新下一次重置时间 |
|
||
|
||
### 重置时间计算
|
||
|
||
```java
|
||
LocalDateTime.now().plusDays(1).withHour(0).withMinute(0).withSecond(0)
|
||
```
|
||
|
||
示例:
|
||
- 当前时间:2026-01-16 23:59:59
|
||
- 重置时间:2026-01-17 00:00:00
|
||
|
||
## 配置示例
|
||
|
||
### Quartz 任务配置
|
||
|
||
```sql
|
||
INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, status, remark)
|
||
VALUES (
|
||
'每日限流重置任务',
|
||
'DEFAULT',
|
||
'rateLimitResetTask.resetDailyRateLimits',
|
||
'0 0 0 * * ?',
|
||
'0',
|
||
'每天凌晨0点执行每日限流重置任务'
|
||
);
|
||
```
|
||
|
||
### Cron 表达式说明
|
||
|
||
| 字段 | 值 | 说明 |
|
||
|------|-----|------|
|
||
| 秒 | 0 | 第0秒 |
|
||
| 分 | 0 | 第0分 |
|
||
| 时 | 0 | 凌晨0点 |
|
||
| 日 | * | 每天 |
|
||
| 月 | * | 每月 |
|
||
| 周 | ? | 不指定 |
|
||
|
||
## 注意事项
|
||
|
||
1. **执行时间建议**
|
||
- 建议在每天凌晨0点执行
|
||
- 确保在新的一天开始时重置所有限流配置
|
||
- 避免在其他时间执行,以免影响业务
|
||
|
||
2. **限流配置要求**
|
||
- 确保限流配置的 `limitType` 字段为 "Daily"
|
||
- 确保限流配置的 `maxLimit` 字段不为空
|
||
- 确保限流配置的 `maxLimit` 字段大于0
|
||
|
||
3. **重置时机**
|
||
- 任务执行后,所有每日限流配置的使用量都会被重置为0
|
||
- 剩余值会被重置为最大限制值
|
||
- 下一次重置时间会被设置为明天0点
|
||
|
||
4. **阻止状态处理**
|
||
- 如果限流配置当前被阻止(isBlocked = true),任务会自动解除阻止状态
|
||
- 解除阻止状态后,API 调用可以正常进行
|
||
- 如果限流配置没有被阻止,isBlocked 字段保持不变
|
||
|
||
5. **数据一致性**
|
||
- 任务执行前,确保所有限流配置的数据完整
|
||
- 任务执行后,检查重置结果是否正确
|
||
- 如果任务执行失败,需要手动重置限流配置
|
||
|
||
6. **监控和告警**
|
||
- 建议监控任务执行状态
|
||
- 如果任务执行失败,及时告警
|
||
- 定期检查限流配置的重置时间是否正确
|
||
|
||
## 相关接口
|
||
|
||
- [导出限流配置列表](../integration/DataiIntegrationRateLimitController/0001-export-rate-limit-list.md) - 导出限流配置列表
|
||
|
||
## 相关文档
|
||
|
||
无(该任务为系统维护任务,无专门的需求文档和架构决策)
|
||
|
||
## 测试信息
|
||
|
||
### 测试环境
|
||
|
||
- **环境**: 开发环境
|
||
- **版本**: v1.0
|
||
|
||
### 测试用例
|
||
|
||
| 测试场景 | 输入参数 | 预期结果 | 实际结果 | 状态 |
|
||
|----------|----------|----------|----------|------|
|
||
| 正常重置 | 无配置 | 成功重置所有每日限流配置 | 成功重置所有每日限流配置 | 通过 |
|
||
| 重置被阻止的配置 | isBlocked = true | 解除阻止状态,重置使用量和剩余值 | 解除阻止状态,重置使用量和剩余值 | 通过 |
|
||
| 重置未阻止的配置 | isBlocked = false | 重置使用量和剩余值,保持阻止状态不变 | 重置使用量和剩余值,保持阻止状态不变 | 通过 |
|
||
| 重置时间为明天0点 | 当前时间为任意时间 | 重置时间设置为明天0点 | 重置时间设置为明天0点 | 通过 |
|
||
| 无每日限流配置 | limitType != "Daily" | 不处理该配置 | 不处理该配置 | 通过 |
|
||
|
||
## 实现细节
|
||
|
||
- 使用 `@Component("rateLimitResetTask")` 注解注册为 Spring Bean
|
||
- 使用 `@Slf4j` 注解进行日志记录
|
||
- 使用 `@Autowired` 注入 `IDataiIntegrationRateLimitService`
|
||
- 查询所有每日限流配置(limitType = "Daily")
|
||
- 遍历每个限流配置,执行重置操作
|
||
- 如果当前被阻止,解除阻止状态
|
||
- 重置使用量为0,剩余值为最大限制值
|
||
- 更新重置时间为明天0点
|
||
- 更新数据库
|
||
- 记录详细的日志信息,便于问题排查
|