@llryiop/avatar-boot-cli 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/exam-question-generate-api.md +163 -0
- package/package.json +1 -1
- package/src/prompts.js +3 -3
- package/src/transform.js +1 -1
- package/templates/.claude/skills/avatar-boot-starter-feign/README.md +243 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/SKILL.md +47 -219
- package/templates/.claude/skills/avatar-boot-starter-feign/references//345/212/237/350/203/275/350/257/246/350/247/243.md +65 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/references//345/277/253/351/200/237/346/216/245/345/205/245/346/214/207/345/215/227.md +75 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/references//351/205/215/347/275/256/345/217/202/350/200/203.md +70 -0
- package/templates/.claude/skills/avatar-boot-starter-job/README.md +437 -0
- package/templates/.claude/skills/avatar-boot-starter-job/SKILL.md +35 -414
- package/templates/.claude/skills/avatar-boot-starter-job/references//345/270/270/350/247/201/351/227/256/351/242/230.md +55 -0
- package/templates/.claude/skills/avatar-boot-starter-job/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +124 -0
- package/templates/.claude/skills/avatar-boot-starter-job/references//347/233/221/346/216/247/346/214/207/346/240/207.md +72 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/README.md +580 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/SKILL.md +36 -560
- package/templates/.claude/skills/avatar-boot-starter-kafka/references//346/234/200/344/275/263/345/256/236/350/267/265.md +43 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/references//346/240/270/345/277/203/345/212/237/350/203/275.md +117 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/references//351/205/215/347/275/256/345/217/202/350/200/203.md +54 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/README.md +572 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/SKILL.md +40 -550
- package/templates/.claude/skills/avatar-boot-starter-mysql/references//345/256/236/344/275/223/344/270/216/345/212/237/350/203/275.md +96 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/346/225/260/346/215/256/346/272/220.md +91 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/references//351/253/230/347/272/247/347/211/271/346/200/247/344/270/216/351/205/215/347/275/256.md +59 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/README.md +901 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/SKILL.md +40 -879
- package/templates/.claude/skills/avatar-boot-starter-nacos/references//345/212/237/350/203/275/344/275/277/347/224/250.md +134 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +96 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/references//346/225/205/351/232/234/346/216/222/346/237/245.md +64 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/README.md +594 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/SKILL.md +52 -570
- package/templates/.claude/skills/avatar-boot-starter-oss/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +77 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/references//346/240/270/345/277/203/345/212/237/350/203/275.md +94 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/references//350/247/204/350/214/203/344/270/216/346/263/250/346/204/217/344/272/213/351/241/271.md +61 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/README.md +586 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/SKILL.md +42 -566
- package/templates/.claude/skills/avatar-boot-starter-redis/references//345/277/253/351/200/237/346/216/245/345/205/245/344/270/216/351/205/215/347/275/256.md +78 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/references//346/225/260/346/215/256/346/223/215/344/275/234.md +111 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/references//351/253/230/347/272/247/345/212/237/350/203/275.md +90 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/README.md +662 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/SKILL.md +48 -640
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//346/240/270/345/277/203/345/212/237/350/203/275.md +101 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//351/205/215/347/275/256/344/270/216/346/263/250/346/204/217/344/272/213/351/241/271.md +44 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//351/253/230/347/272/247/347/211/271/346/200/247.md +71 -0
- package/templates/.claude/skills/avatar-boot-starter-web/README.md +1007 -0
- package/templates/.claude/skills/avatar-boot-starter-web/SKILL.md +150 -1003
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-LogInfo/346/263/250/350/247/243.md +75 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/345/205/250/345/261/200/345/274/202/345/270/270/345/244/204/347/220/206.md +90 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/346/214/207/346/240/207/347/233/221/346/216/247.md +74 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/346/227/245/345/277/227/344/275/223/347/263/273.md +73 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/212/237/350/203/275-/350/257/267/346/261/202/344/270/212/344/270/213/346/226/207.md +77 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//345/277/253/351/200/237/346/216/245/345/205/245/346/214/207/345/215/227.md +52 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//346/263/250/346/204/217/344/272/213/351/241/271.md +68 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//350/207/252/345/256/232/344/271/211/346/211/251/345/261/225/346/214/207/345/215/227.md +107 -0
- package/templates/.claude/skills/avatar-boot-starter-web/references//351/205/215/347/275/256/345/217/202/350/200/203.md +107 -0
- package/templates/.claude/skills/crud-generator/SKILL.md +133 -64
- package/templates/.claude/skills/database-design/README.md +207 -0
- package/templates/.claude/skills/database-design/SKILL.md +469 -82
- package/templates/.claude/skills/database-design/references//345/221/275/345/220/215/350/247/204/350/214/203.md +232 -0
- package/templates/.claude/skills/database-design/references//345/255/227/346/256/265/347/261/273/345/236/213/350/247/204/350/214/203.md +400 -0
- package/templates/.claude/skills/database-design/references//347/264/242/345/274/225/350/247/204/350/214/203.md +506 -0
- package/templates/avatar-scaffold-api/pom.xml +0 -5
- package/templates/avatar-scaffold-service/pom.xml +25 -87
- package/templates/avatar-scaffold-service/src/main/resources/application-dev.yaml +3 -5
- package/templates/avatar-scaffold-service/src/main/resources/application-local.yaml +2 -2
- package/templates/pom.xml +9 -18
|
@@ -1,437 +1,58 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: avatar-boot-starter-job
|
|
3
|
-
description:
|
|
3
|
+
description: Avatar Boot XXL-Job 模块使用指南。当用户询问分布式任务调度、XXL-Job 配置、@XxlJob 注解、任务处理器编写、监控指标,或需要接入 avatar-boot-starter-job 时触发。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Avatar Boot
|
|
6
|
+
# Avatar Boot Starter Job 使用指南
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
你是 Avatar Boot XXL-Job 模块的使用顾问与开发助手。
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
- ✅ **原生配置兼容** - 使用 XXL-Job 原生配置属性(xxl.job.*),无需学习新配置
|
|
12
|
-
- ✅ **条件装配** - 支持通过 `enabled` 开关控制是否启用
|
|
13
|
-
- ✅ **AOP 监控** - 自动拦截 @XxlJob 方法,记录执行指标
|
|
14
|
-
- ✅ **Micrometer 集成** - 内置任务执行和执行器状态监控指标
|
|
15
|
-
- ✅ **优雅日志** - 清晰的启动和执行日志,便于问题排查
|
|
16
|
-
- ✅ **完全兼容** - 100% 兼容 XXL-Job 原生注解和功能
|
|
10
|
+
## 交互流程(必须遵守)
|
|
17
11
|
|
|
18
|
-
|
|
12
|
+
**每次被触发时,先通过 AskUserQuestion 工具询问用户意图:**
|
|
19
13
|
|
|
20
|
-
|
|
14
|
+
问题:"您好!我是 Avatar Boot XXL-Job 模块助手,请问您需要哪方面的帮助?"
|
|
15
|
+
选项:
|
|
16
|
+
1. **快速接入** - 添加依赖、配置执行器、编写任务处理器
|
|
17
|
+
2. **任务编写** - 简单任务、带参数任务、分片任务、结果回调
|
|
18
|
+
3. **配置说明** - 必填/可选配置项、多环境配置、禁用 XXL-Job
|
|
19
|
+
4. **监控指标** - Micrometer 指标、Prometheus 查询、Grafana 面板
|
|
20
|
+
5. **常见问题** - 执行器注册失败、任务无法触发、日志无法查看
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
**根据用户选择,用 Read 工具按下方「文档读取路由」加载对应文档,然后给出具体指导。**
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
<dependency>
|
|
26
|
-
<groupId>com.iflytek.avatar.boot</groupId>
|
|
27
|
-
<artifactId>avatar-boot-starter-job</artifactId>
|
|
28
|
-
</dependency>
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### 2. 配置文件
|
|
32
|
-
|
|
33
|
-
在 `application.yml` 中添加配置:
|
|
34
|
-
|
|
35
|
-
```yaml
|
|
36
|
-
xxl:
|
|
37
|
-
job:
|
|
38
|
-
enabled: true # 是否启用(默认 true)
|
|
39
|
-
admin:
|
|
40
|
-
addresses: http://localhost:8080/xxl-job-admin # 调度中心地址
|
|
41
|
-
executor:
|
|
42
|
-
appname: your-app-name # 执行器名称(必填)
|
|
43
|
-
port: 9999 # 执行器端口(默认 9999)
|
|
44
|
-
logpath: logs/xxl-job # 日志路径(默认 logs/xxl-job)
|
|
45
|
-
logretentiondays: 30 # 日志保留天数(默认 30)
|
|
46
|
-
access-token: your-token # 访问令牌(可选)
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
### 3. 编写任务处理器
|
|
50
|
-
|
|
51
|
-
使用 `@XxlJob` 注解标记任务方法:
|
|
52
|
-
|
|
53
|
-
```java
|
|
54
|
-
package com.example.job;
|
|
55
|
-
|
|
56
|
-
import com.xxl.job.core.context.XxlJobHelper;
|
|
57
|
-
import com.xxl.job.core.handler.annotation.XxlJob;
|
|
58
|
-
import lombok.extern.slf4j.Slf4j;
|
|
59
|
-
import org.springframework.stereotype.Component;
|
|
24
|
+
---
|
|
60
25
|
|
|
61
|
-
|
|
62
|
-
@Component
|
|
63
|
-
public class SampleJobHandler {
|
|
26
|
+
## 行为准则
|
|
64
27
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
public void demoJobHandler() {
|
|
70
|
-
log.info("XXL-JOB, Hello World.");
|
|
71
|
-
}
|
|
28
|
+
1. **回答要具体**:引用具体的配置项、注解、PromQL 语句
|
|
29
|
+
2. **主动提醒**:`appname` 必须与调度中心配置一致
|
|
30
|
+
3. **使用中文回答**
|
|
31
|
+
4. **版本说明**:XXL-Job 2.4.0 + Spring Boot 3.5.3 + Java 21
|
|
72
32
|
|
|
73
|
-
|
|
74
|
-
* 带参数的任务示例
|
|
75
|
-
*/
|
|
76
|
-
@XxlJob("paramJobHandler")
|
|
77
|
-
public void paramJobHandler() {
|
|
78
|
-
String param = XxlJobHelper.getJobParam();
|
|
79
|
-
log.info("XXL-JOB, 接收参数: {}", param);
|
|
80
|
-
}
|
|
33
|
+
---
|
|
81
34
|
|
|
82
|
-
|
|
83
|
-
* 分片任务示例
|
|
84
|
-
*/
|
|
85
|
-
@XxlJob("shardingJobHandler")
|
|
86
|
-
public void shardingJobHandler() {
|
|
87
|
-
int shardIndex = XxlJobHelper.getShardIndex();
|
|
88
|
-
int shardTotal = XxlJobHelper.getShardTotal();
|
|
89
|
-
log.info("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
```
|
|
35
|
+
## 文档读取路由
|
|
93
36
|
|
|
94
|
-
|
|
95
|
-
- 任务处理器类必须被 Spring 管理(添加 `@Component` 注解)
|
|
96
|
-
- `@XxlJob` 注解的值必须与调度中心配置的 JobHandler 名称一致
|
|
97
|
-
- 监控指标会自动记录所有 @XxlJob 方法的执行情况
|
|
37
|
+
> 所有路径相对于 skill 目录 `docs/skills/avatar-boot-starter-job-skill/`
|
|
98
38
|
|
|
99
|
-
|
|
39
|
+
| 用户需求 | 需读取的文件 |
|
|
40
|
+
|:--|:--|
|
|
41
|
+
| 快速接入 / 任务编写 / 配置说明 | `references/快速接入与配置.md` |
|
|
42
|
+
| 监控指标 | `references/监控指标.md` |
|
|
43
|
+
| 常见问题 | `references/常见问题.md` |
|
|
100
44
|
|
|
101
|
-
|
|
102
|
-
2. 执行器管理 -> 新增执行器(AppName 与配置文件中的 `appname` 一致)
|
|
103
|
-
3. 任务管理 -> 新增任务
|
|
104
|
-
- JobHandler: `demoJobHandler`(与 @XxlJob 注解的值一致)
|
|
105
|
-
- 调度类型: CRON
|
|
106
|
-
- Cron: `0 0/1 * * * ?`(每分钟执行一次)
|
|
45
|
+
---
|
|
107
46
|
|
|
108
|
-
##
|
|
47
|
+
## 通用参考信息
|
|
109
48
|
|
|
110
49
|
### 必填配置
|
|
111
50
|
|
|
112
|
-
| 配置项 | 说明 |
|
|
113
|
-
|
|
114
|
-
| `xxl.job.admin.addresses` | 调度中心地址 |
|
|
115
|
-
| `xxl.job.executor.appname` |
|
|
116
|
-
|
|
117
|
-
### 可选配置
|
|
118
|
-
|
|
119
|
-
| 配置项 | 说明 | 默认值 |
|
|
120
|
-
|--------|------|--------|
|
|
121
|
-
| `xxl.job.enabled` | 是否启用 XXL-Job | `true` |
|
|
122
|
-
| `xxl.job.executor.port` | 执行器端口 | `9999` |
|
|
123
|
-
| `xxl.job.executor.ip` | 执行器 IP(为空自动获取) | 空 |
|
|
124
|
-
| `xxl.job.executor.address` | 执行器注册地址(优先使用) | 空 |
|
|
125
|
-
| `xxl.job.executor.logpath` | 日志路径 | `logs/xxl-job` |
|
|
126
|
-
| `xxl.job.executor.logretentiondays` | 日志保留天数 | `30` |
|
|
127
|
-
| `xxl.job.access-token` | 访问令牌 | 空 |
|
|
128
|
-
|
|
129
|
-
### 监控配置
|
|
130
|
-
|
|
131
|
-
| 配置项 | 说明 | 默认值 |
|
|
132
|
-
|--------|------|--------|
|
|
133
|
-
| `xxl.job.metrics.enabled` | 是否启用所有监控指标 | `true` |
|
|
134
|
-
| `xxl.job.metrics.execution-enabled` | 是否启用任务执行监控 | `true` |
|
|
135
|
-
| `xxl.job.metrics.executor-enabled` | 是否启用执行器状态监控 | `true` |
|
|
136
|
-
|
|
137
|
-
## 功能详解
|
|
138
|
-
|
|
139
|
-
### 1. 自动配置机制
|
|
140
|
-
|
|
141
|
-
模块使用 Spring Boot 自动配置机制,满足以下条件时自动装配:
|
|
142
|
-
|
|
143
|
-
- Classpath 中存在 `XxlJobSpringExecutor` 类
|
|
144
|
-
- 配置 `xxl.job.enabled=true`(默认为 true)
|
|
145
|
-
- 未手动定义 `XxlJobSpringExecutor` Bean
|
|
146
|
-
|
|
147
|
-
**启动日志:**
|
|
148
|
-
```
|
|
149
|
-
>>>>>>>>>>> XXL-Job 执行器配置初始化
|
|
150
|
-
>>>>>>>>>>> XXL-Job 执行器配置完成: appname=my-app, adminAddresses=http://localhost:8080/xxl-job-admin
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
### 2. AOP 监控拦截
|
|
154
|
-
|
|
155
|
-
使用 AspectJ 自动拦截所有 `@XxlJob` 注解的方法:
|
|
156
|
-
|
|
157
|
-
- **执行前**:记录开始时间,增加活跃任务计数
|
|
158
|
-
- **执行后**:记录执行时长、成功/失败状态
|
|
159
|
-
- **异常时**:记录异常信息和执行时长
|
|
160
|
-
- **最终**:减少活跃任务计数
|
|
161
|
-
|
|
162
|
-
**日志输出:**
|
|
163
|
-
```
|
|
164
|
-
DEBUG: Job [demoJobHandler] executed successfully in 125ms
|
|
165
|
-
ERROR: Job [failedJobHandler] failed after 50ms
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### 3. 任务执行结果回调
|
|
169
|
-
|
|
170
|
-
```java
|
|
171
|
-
@XxlJob("callbackJobHandler")
|
|
172
|
-
public void callbackJobHandler() {
|
|
173
|
-
try {
|
|
174
|
-
// 业务逻辑
|
|
175
|
-
XxlJobHelper.handleSuccess("任务执行成功");
|
|
176
|
-
} catch (Exception e) {
|
|
177
|
-
XxlJobHelper.handleFail("任务执行失败: " + e.getMessage());
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
### 4. 任务日志输出
|
|
183
|
-
|
|
184
|
-
```java
|
|
185
|
-
@XxlJob("logJobHandler")
|
|
186
|
-
public void logJobHandler() {
|
|
187
|
-
XxlJobHelper.log("这是一条任务日志");
|
|
188
|
-
XxlJobHelper.log("支持多行日志输出");
|
|
189
|
-
}
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
## 监控指标
|
|
193
|
-
|
|
194
|
-
本 Starter 内置了基于 Micrometer 的监控指标采集功能,可与 Prometheus、Grafana 等监控系统集成。
|
|
195
|
-
|
|
196
|
-
### 启用监控
|
|
197
|
-
|
|
198
|
-
监控功能默认启用,如需禁用可通过配置:
|
|
199
|
-
|
|
200
|
-
```yaml
|
|
201
|
-
xxl:
|
|
202
|
-
job:
|
|
203
|
-
metrics:
|
|
204
|
-
enabled: false # 禁用所有监控指标
|
|
205
|
-
execution-enabled: true # 仅启用任务执行监控(默认 true)
|
|
206
|
-
executor-enabled: true # 仅启用执行器状态监控(默认 true)
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
### 可用指标
|
|
210
|
-
|
|
211
|
-
#### 1. 任务执行指标
|
|
212
|
-
|
|
213
|
-
| 指标名称 | 类型 | 标签 | 说明 |
|
|
214
|
-
|---------|------|------|------|
|
|
215
|
-
| `xxl.job.execution.count` | Counter | `job_handler`, `status` | 任务执行次数(status: success/failure) |
|
|
216
|
-
| `xxl.job.execution.time` | Timer | `job_handler`, `status` | 任务执行耗时(毫秒) |
|
|
217
|
-
| `xxl.job.execution.active` | Gauge | 无 | 当前正在执行的任务数 |
|
|
218
|
-
|
|
219
|
-
#### 2. 执行器状态指标
|
|
220
|
-
|
|
221
|
-
| 指标名称 | 类型 | 标签 | 说明 |
|
|
222
|
-
|---------|------|------|------|
|
|
223
|
-
| `xxl.job.executor.registered` | Gauge | `app_name` | 执行器注册状态(1=已注册,0=未注册) |
|
|
224
|
-
| `xxl.job.executor.handlers.total` | Gauge | `app_name` | 已注册的 JobHandler 总数 |
|
|
225
|
-
|
|
226
|
-
### Prometheus 查询示例
|
|
227
|
-
|
|
228
|
-
```promql
|
|
229
|
-
# 查询任务执行成功率
|
|
230
|
-
sum(rate(xxl_job_execution_count_total{status="success"}[5m]))
|
|
231
|
-
/
|
|
232
|
-
sum(rate(xxl_job_execution_count_total[5m])) * 100
|
|
233
|
-
|
|
234
|
-
# 查询任务平均执行时间(秒)
|
|
235
|
-
rate(xxl_job_execution_time_seconds_sum[5m])
|
|
236
|
-
/
|
|
237
|
-
rate(xxl_job_execution_time_seconds_count[5m])
|
|
238
|
-
|
|
239
|
-
# 查询特定任务的失败次数
|
|
240
|
-
sum(xxl_job_execution_count_total{job_handler="demoJobHandler", status="failure"})
|
|
241
|
-
|
|
242
|
-
# 查询当前活跃任务数
|
|
243
|
-
xxl_job_execution_active
|
|
244
|
-
|
|
245
|
-
# 查询执行器注册状态
|
|
246
|
-
xxl_job_executor_registered{app_name="your-app-name"}
|
|
247
|
-
|
|
248
|
-
# 查询已注册的 JobHandler 数量
|
|
249
|
-
xxl_job_executor_handlers_total{app_name="your-app-name"}
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
### Grafana 面板配置
|
|
253
|
-
|
|
254
|
-
推荐创建以下监控面板:
|
|
255
|
-
|
|
256
|
-
#### 1. 任务执行概览
|
|
257
|
-
- **总执行次数**:`sum(increase(xxl_job_execution_count_total[1h]))`
|
|
258
|
-
- **成功率**:`sum(rate(xxl_job_execution_count_total{status="success"}[5m])) / sum(rate(xxl_job_execution_count_total[5m])) * 100`
|
|
259
|
-
- **平均耗时**:`rate(xxl_job_execution_time_seconds_sum[5m]) / rate(xxl_job_execution_time_seconds_count[5m])`
|
|
260
|
-
|
|
261
|
-
#### 2. 任务执行趋势
|
|
262
|
-
- **执行次数趋势**:`rate(xxl_job_execution_count_total[5m])`(按 job_handler 分组)
|
|
263
|
-
- **失败次数趋势**:`rate(xxl_job_execution_count_total{status="failure"}[5m])`
|
|
264
|
-
|
|
265
|
-
#### 3. 执行器状态
|
|
266
|
-
- **注册状态**:`xxl_job_executor_registered`
|
|
267
|
-
- **Handler 数量**:`xxl_job_executor_handlers_total`
|
|
268
|
-
- **活跃任务数**:`xxl_job_execution_active`
|
|
269
|
-
|
|
270
|
-
#### 4. 性能分析
|
|
271
|
-
- **P95 耗时**:`histogram_quantile(0.95, rate(xxl_job_execution_time_seconds_bucket[5m]))`
|
|
272
|
-
- **P99 耗时**:`histogram_quantile(0.99, rate(xxl_job_execution_time_seconds_bucket[5m]))`
|
|
273
|
-
|
|
274
|
-
### 集成 Prometheus
|
|
275
|
-
|
|
276
|
-
在 `application.yml` 中启用 Prometheus 端点:
|
|
277
|
-
|
|
278
|
-
```yaml
|
|
279
|
-
management:
|
|
280
|
-
endpoints:
|
|
281
|
-
web:
|
|
282
|
-
exposure:
|
|
283
|
-
include: prometheus,health,info
|
|
284
|
-
metrics:
|
|
285
|
-
export:
|
|
286
|
-
prometheus:
|
|
287
|
-
enabled: true
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
访问 `http://localhost:8080/actuator/prometheus` 查看指标数据。
|
|
291
|
-
|
|
292
|
-
## 使用场景
|
|
293
|
-
|
|
294
|
-
### 场景 1:开发环境禁用任务调度
|
|
295
|
-
|
|
296
|
-
```yaml
|
|
297
|
-
# application-dev.yml
|
|
298
|
-
xxl:
|
|
299
|
-
job:
|
|
300
|
-
enabled: false # 开发环境禁用
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
### 场景 2:多环境配置
|
|
304
|
-
|
|
305
|
-
```yaml
|
|
306
|
-
# application-prod.yml
|
|
307
|
-
xxl:
|
|
308
|
-
job:
|
|
309
|
-
enabled: true
|
|
310
|
-
admin:
|
|
311
|
-
addresses: http://prod-xxl-job:8080/xxl-job-admin
|
|
312
|
-
executor:
|
|
313
|
-
appname: prod-app-executor
|
|
314
|
-
port: 9999
|
|
315
|
-
access-token: ${XXL_JOB_TOKEN} # 从环境变量读取
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
### 场景 3:只监控特定任务
|
|
319
|
-
|
|
320
|
-
```yaml
|
|
321
|
-
xxl:
|
|
322
|
-
job:
|
|
323
|
-
metrics:
|
|
324
|
-
execution-enabled: true # 启用任务执行监控
|
|
325
|
-
executor-enabled: false # 禁用执行器状态监控
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
## 高级用法
|
|
329
|
-
|
|
330
|
-
### 1. 自定义执行器配置
|
|
331
|
-
|
|
332
|
-
```yaml
|
|
333
|
-
xxl:
|
|
334
|
-
job:
|
|
335
|
-
executor:
|
|
336
|
-
ip: 192.168.1.100 # 指定执行器 IP
|
|
337
|
-
address: http://192.168.1.100:9999 # 指定注册地址(优先级最高)
|
|
338
|
-
logpath: /data/logs/xxl-job # 使用绝对路径
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
### 2. 多调度中心配置
|
|
342
|
-
|
|
343
|
-
```yaml
|
|
344
|
-
xxl:
|
|
345
|
-
job:
|
|
346
|
-
admin:
|
|
347
|
-
addresses: http://admin1:8080/xxl-job-admin,http://admin2:8080/xxl-job-admin
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
### 3. 禁用监控指标
|
|
351
|
-
|
|
352
|
-
```yaml
|
|
353
|
-
xxl:
|
|
354
|
-
job:
|
|
355
|
-
metrics:
|
|
356
|
-
enabled: false # 完全禁用监控
|
|
357
|
-
```
|
|
358
|
-
|
|
359
|
-
## 常见问题
|
|
360
|
-
|
|
361
|
-
### 1. 执行器无法注册到调度中心
|
|
362
|
-
|
|
363
|
-
**原因**:网络不通或配置错误
|
|
364
|
-
|
|
365
|
-
**解决**:
|
|
366
|
-
- 检查 `xxl.job.admin.addresses` 是否正确
|
|
367
|
-
- 检查调度中心是否启动
|
|
368
|
-
- 检查执行器端口是否被占用
|
|
369
|
-
- 查看启动日志中的错误信息
|
|
370
|
-
|
|
371
|
-
### 2. 任务无法触发
|
|
372
|
-
|
|
373
|
-
**原因**:JobHandler 名称不匹配
|
|
374
|
-
|
|
375
|
-
**解决**:
|
|
376
|
-
- 确保 `@XxlJob` 注解的值与调度中心配置的 JobHandler 一致
|
|
377
|
-
- 确保任务处理器类被 Spring 管理(添加 `@Component` 注解)
|
|
378
|
-
- 检查执行器是否成功注册
|
|
379
|
-
|
|
380
|
-
### 3. 日志无法查看
|
|
381
|
-
|
|
382
|
-
**原因**:日志路径权限不足
|
|
383
|
-
|
|
384
|
-
**解决**:
|
|
385
|
-
- 检查 `xxl.job.executor.logpath` 路径是否有写权限
|
|
386
|
-
- 使用绝对路径或确保相对路径可写
|
|
387
|
-
- 检查磁盘空间是否充足
|
|
388
|
-
|
|
389
|
-
### 4. 监控指标不显示
|
|
390
|
-
|
|
391
|
-
**原因**:Actuator 端点未暴露或监控被禁用
|
|
392
|
-
|
|
393
|
-
**解决**:
|
|
394
|
-
- 确保 `xxl.job.metrics.enabled=true`
|
|
395
|
-
- 检查 Actuator 配置是否正确
|
|
396
|
-
- 访问 `/actuator/prometheus` 验证指标是否存在
|
|
397
|
-
|
|
398
|
-
### 5. 任务执行时间不准确
|
|
399
|
-
|
|
400
|
-
**原因**:AOP 拦截可能包含框架开销
|
|
401
|
-
|
|
402
|
-
**解决**:
|
|
403
|
-
- 监控指标记录的是方法执行时间(包含 AOP 开销)
|
|
404
|
-
- 如需精确业务逻辑耗时,在方法内部单独计时
|
|
405
|
-
- AOP 开销通常在 1-5ms 范围内
|
|
406
|
-
|
|
407
|
-
## 架构说明
|
|
408
|
-
|
|
409
|
-
### 核心组件
|
|
410
|
-
|
|
411
|
-
- **XxlJobAutoConfiguration**:自动配置类,创建 XxlJobSpringExecutor Bean
|
|
412
|
-
- **XxlJobProperties**:配置属性类,映射 xxl.job.* 配置
|
|
413
|
-
- **XxlJobMetricsAspect**:AOP 切面,拦截 @XxlJob 方法记录指标
|
|
414
|
-
- **JobMetricsRecorder**:指标记录器,封装 Micrometer API
|
|
415
|
-
- **ExecutorMetricsCollector**:执行器状态收集器,定期更新执行器指标
|
|
416
|
-
|
|
417
|
-
### 自动配置条件
|
|
418
|
-
|
|
419
|
-
```java
|
|
420
|
-
@ConditionalOnClass(XxlJobSpringExecutor.class) // 类路径存在 XXL-Job
|
|
421
|
-
@ConditionalOnProperty(prefix = "xxl.job", name = "enabled",
|
|
422
|
-
havingValue = "true", matchIfMissing = true) // 配置启用
|
|
423
|
-
@ConditionalOnMissingBean // 未手动定义 Bean
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
## 依赖版本
|
|
427
|
-
|
|
428
|
-
- XXL-Job: 2.4.0
|
|
429
|
-
- Spring Boot: 3.5.3
|
|
430
|
-
- Micrometer: 由 Spring Boot BOM 管理
|
|
431
|
-
- Java: 21
|
|
51
|
+
| 配置项 | 说明 |
|
|
52
|
+
|:--|:--|
|
|
53
|
+
| `xxl.job.admin.addresses` | 调度中心地址 |
|
|
54
|
+
| `xxl.job.executor.appname` | 执行器名称(与调度中心一致) |
|
|
432
55
|
|
|
433
|
-
|
|
56
|
+
### 延迟级别速查(sendDelayed 第4个参数)
|
|
434
57
|
|
|
435
|
-
|
|
436
|
-
- [XXL-Job GitHub](https://github.com/xuxueli/xxl-job)
|
|
437
|
-
- [Micrometer 文档](https://micrometer.io/docs)
|
|
58
|
+
1s / 5s / 10s / 30s / 1m / 2m / 3m / 4m / 5m / 6m / 7m / 8m / 9m / 10m / 20m / 30m / 1h / 2h
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# XXL-Job 常见问题
|
|
2
|
+
|
|
3
|
+
## 1. 执行器无法注册到调度中心
|
|
4
|
+
|
|
5
|
+
**原因**:网络不通或配置错误
|
|
6
|
+
|
|
7
|
+
**排查步骤**:
|
|
8
|
+
- 检查 `xxl.job.admin.addresses` 是否正确
|
|
9
|
+
- 检查调度中心是否已启动
|
|
10
|
+
- 检查执行器端口是否被占用:`netstat -an | grep 9999`
|
|
11
|
+
- 开启 DEBUG 日志排查:`logging.level.com.xxl.job=DEBUG`
|
|
12
|
+
|
|
13
|
+
## 2. 任务无法触发
|
|
14
|
+
|
|
15
|
+
**原因**:JobHandler 名称不匹配
|
|
16
|
+
|
|
17
|
+
**排查步骤**:
|
|
18
|
+
- 确保 `@XxlJob` 注解的值与调度中心配置的 JobHandler 完全一致(区分大小写)
|
|
19
|
+
- 确保任务处理器类被 Spring 管理(添加 `@Component` 注解)
|
|
20
|
+
- 确认执行器已成功注册(在调度中心执行器管理页面查看)
|
|
21
|
+
|
|
22
|
+
## 3. 日志无法查看
|
|
23
|
+
|
|
24
|
+
**原因**:日志路径权限不足
|
|
25
|
+
|
|
26
|
+
**排查步骤**:
|
|
27
|
+
- 检查 `xxl.job.executor.logpath` 路径是否有写权限
|
|
28
|
+
- 建议使用绝对路径,或确保相对路径可写
|
|
29
|
+
- 容器部署时注意挂载日志目录
|
|
30
|
+
|
|
31
|
+
## 4. 本地开发不想启动 XXL-Job
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
# application-dev.yml
|
|
35
|
+
xxl:
|
|
36
|
+
job:
|
|
37
|
+
enabled: false
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 5. 分片任务数据重复处理
|
|
41
|
+
|
|
42
|
+
**原因**:分片索引使用不正确
|
|
43
|
+
|
|
44
|
+
**正确用法**:
|
|
45
|
+
```java
|
|
46
|
+
@XxlJob("shardingJobHandler")
|
|
47
|
+
public void shardingJobHandler() {
|
|
48
|
+
int shardIndex = XxlJobHelper.getShardIndex();
|
|
49
|
+
int shardTotal = XxlJobHelper.getShardTotal();
|
|
50
|
+
|
|
51
|
+
// 按分片索引过滤数据,例如按 ID 取模
|
|
52
|
+
List<Long> ids = dataMapper.selectIdsByMod(shardIndex, shardTotal);
|
|
53
|
+
ids.forEach(this::processData);
|
|
54
|
+
}
|
|
55
|
+
```
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# XXL-Job 快速接入与配置
|
|
2
|
+
|
|
3
|
+
## 1. 添加依赖
|
|
4
|
+
|
|
5
|
+
```xml
|
|
6
|
+
<dependency>
|
|
7
|
+
<groupId>com.iflytek.avatar.boot</groupId>
|
|
8
|
+
<artifactId>avatar-boot-starter-job</artifactId>
|
|
9
|
+
</dependency>
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## 2. 配置文件
|
|
13
|
+
|
|
14
|
+
```yaml
|
|
15
|
+
xxl:
|
|
16
|
+
job:
|
|
17
|
+
enabled: true # 是否启用(默认 true)
|
|
18
|
+
admin:
|
|
19
|
+
addresses: http://localhost:8080/xxl-job-admin # 调度中心地址(必填)
|
|
20
|
+
executor:
|
|
21
|
+
appname: your-app-name # 执行器名称(必填,与调度中心一致)
|
|
22
|
+
port: 9999 # 执行器端口(默认 9999)
|
|
23
|
+
logpath: logs/xxl-job # 日志路径
|
|
24
|
+
logretentiondays: 30 # 日志保留天数
|
|
25
|
+
access-token: your-token # 访问令牌(与调度中心保持一致)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## 3. 编写任务处理器
|
|
29
|
+
|
|
30
|
+
```java
|
|
31
|
+
import com.xxl.job.core.handler.annotation.XxlJob;
|
|
32
|
+
import com.xxl.job.core.context.XxlJobHelper;
|
|
33
|
+
|
|
34
|
+
@Slf4j
|
|
35
|
+
@Component
|
|
36
|
+
public class SampleJobHandler {
|
|
37
|
+
|
|
38
|
+
// 简单任务
|
|
39
|
+
@XxlJob("demoJobHandler")
|
|
40
|
+
public void demoJobHandler() {
|
|
41
|
+
log.info("XXL-JOB, Hello World.");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 带参数的任务
|
|
45
|
+
@XxlJob("paramJobHandler")
|
|
46
|
+
public void paramJobHandler() {
|
|
47
|
+
String param = XxlJobHelper.getJobParam();
|
|
48
|
+
log.info("接收参数: {}", param);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 分片任务(多实例并行处理不同数据段)
|
|
52
|
+
@XxlJob("shardingJobHandler")
|
|
53
|
+
public void shardingJobHandler() {
|
|
54
|
+
int shardIndex = XxlJobHelper.getShardIndex();
|
|
55
|
+
int shardTotal = XxlJobHelper.getShardTotal();
|
|
56
|
+
log.info("当前分片: {}/{}", shardIndex, shardTotal);
|
|
57
|
+
// 根据分片索引处理对应数据
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// 带结果回调的任务
|
|
61
|
+
@XxlJob("callbackJobHandler")
|
|
62
|
+
public void callbackJobHandler() {
|
|
63
|
+
try {
|
|
64
|
+
// 业务逻辑
|
|
65
|
+
XxlJobHelper.handleSuccess("任务执行成功");
|
|
66
|
+
} catch (Exception e) {
|
|
67
|
+
XxlJobHelper.handleFail("任务执行失败: " + e.getMessage());
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// 任务日志
|
|
72
|
+
@XxlJob("logJobHandler")
|
|
73
|
+
public void logJobHandler() {
|
|
74
|
+
XxlJobHelper.log("这是一条任务日志");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 4. 在调度中心配置任务
|
|
80
|
+
|
|
81
|
+
1. 登录 XXL-Job 调度中心
|
|
82
|
+
2. **执行器管理** → 新增执行器(AppName 与配置文件中的 `appname` 一致)
|
|
83
|
+
3. **任务管理** → 新增任务
|
|
84
|
+
- JobHandler:`demoJobHandler`(与 `@XxlJob` 注解值一致)
|
|
85
|
+
- 调度类型:CRON
|
|
86
|
+
- Cron:`0 0/1 * * * ?`(每分钟执行一次)
|
|
87
|
+
|
|
88
|
+
## 5. 多环境配置
|
|
89
|
+
|
|
90
|
+
```yaml
|
|
91
|
+
# application-dev.yml
|
|
92
|
+
xxl:
|
|
93
|
+
job:
|
|
94
|
+
enabled: false # 开发环境禁用
|
|
95
|
+
|
|
96
|
+
# application-prod.yml
|
|
97
|
+
xxl:
|
|
98
|
+
job:
|
|
99
|
+
enabled: true
|
|
100
|
+
admin:
|
|
101
|
+
addresses: http://prod-xxl-job:8080/xxl-job-admin
|
|
102
|
+
executor:
|
|
103
|
+
appname: prod-app-executor
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 配置说明
|
|
107
|
+
|
|
108
|
+
### 必填配置
|
|
109
|
+
|
|
110
|
+
| 配置项 | 说明 |
|
|
111
|
+
|:--|:--|
|
|
112
|
+
| `xxl.job.admin.addresses` | 调度中心地址 |
|
|
113
|
+
| `xxl.job.executor.appname` | 执行器名称(与调度中心一致) |
|
|
114
|
+
|
|
115
|
+
### 可选配置
|
|
116
|
+
|
|
117
|
+
| 配置项 | 说明 | 默认值 |
|
|
118
|
+
|:--|:--|:--|
|
|
119
|
+
| `xxl.job.enabled` | 是否启用 | `true` |
|
|
120
|
+
| `xxl.job.executor.port` | 执行器端口 | `9999` |
|
|
121
|
+
| `xxl.job.executor.ip` | 执行器 IP(空则自动获取) | 空 |
|
|
122
|
+
| `xxl.job.executor.logpath` | 日志路径 | `logs/xxl-job` |
|
|
123
|
+
| `xxl.job.executor.logretentiondays` | 日志保留天数 | `30` |
|
|
124
|
+
| `xxl.job.access-token` | 访问令牌 | 空 |
|