@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.
Files changed (66) hide show
  1. package/docs/exam-question-generate-api.md +163 -0
  2. package/package.json +1 -1
  3. package/src/prompts.js +3 -3
  4. package/src/transform.js +1 -1
  5. package/templates/.claude/skills/avatar-boot-starter-feign/README.md +243 -0
  6. package/templates/.claude/skills/avatar-boot-starter-feign/SKILL.md +47 -219
  7. package/templates/.claude/skills/avatar-boot-starter-feign/references//345/212/237/350/203/275/350/257/246/350/247/243.md +65 -0
  8. 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
  9. package/templates/.claude/skills/avatar-boot-starter-feign/references//351/205/215/347/275/256/345/217/202/350/200/203.md +70 -0
  10. package/templates/.claude/skills/avatar-boot-starter-job/README.md +437 -0
  11. package/templates/.claude/skills/avatar-boot-starter-job/SKILL.md +35 -414
  12. package/templates/.claude/skills/avatar-boot-starter-job/references//345/270/270/350/247/201/351/227/256/351/242/230.md +55 -0
  13. 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
  14. package/templates/.claude/skills/avatar-boot-starter-job/references//347/233/221/346/216/247/346/214/207/346/240/207.md +72 -0
  15. package/templates/.claude/skills/avatar-boot-starter-kafka/README.md +580 -0
  16. package/templates/.claude/skills/avatar-boot-starter-kafka/SKILL.md +36 -560
  17. package/templates/.claude/skills/avatar-boot-starter-kafka/references//346/234/200/344/275/263/345/256/236/350/267/265.md +43 -0
  18. package/templates/.claude/skills/avatar-boot-starter-kafka/references//346/240/270/345/277/203/345/212/237/350/203/275.md +117 -0
  19. package/templates/.claude/skills/avatar-boot-starter-kafka/references//351/205/215/347/275/256/345/217/202/350/200/203.md +54 -0
  20. package/templates/.claude/skills/avatar-boot-starter-mysql/README.md +572 -0
  21. package/templates/.claude/skills/avatar-boot-starter-mysql/SKILL.md +40 -550
  22. 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
  23. 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
  24. 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
  25. package/templates/.claude/skills/avatar-boot-starter-nacos/README.md +901 -0
  26. package/templates/.claude/skills/avatar-boot-starter-nacos/SKILL.md +40 -879
  27. package/templates/.claude/skills/avatar-boot-starter-nacos/references//345/212/237/350/203/275/344/275/277/347/224/250.md +134 -0
  28. 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
  29. package/templates/.claude/skills/avatar-boot-starter-nacos/references//346/225/205/351/232/234/346/216/222/346/237/245.md +64 -0
  30. package/templates/.claude/skills/avatar-boot-starter-oss/README.md +594 -0
  31. package/templates/.claude/skills/avatar-boot-starter-oss/SKILL.md +52 -570
  32. 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
  33. package/templates/.claude/skills/avatar-boot-starter-oss/references//346/240/270/345/277/203/345/212/237/350/203/275.md +94 -0
  34. 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
  35. package/templates/.claude/skills/avatar-boot-starter-redis/README.md +586 -0
  36. package/templates/.claude/skills/avatar-boot-starter-redis/SKILL.md +42 -566
  37. 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
  38. package/templates/.claude/skills/avatar-boot-starter-redis/references//346/225/260/346/215/256/346/223/215/344/275/234.md +111 -0
  39. package/templates/.claude/skills/avatar-boot-starter-redis/references//351/253/230/347/272/247/345/212/237/350/203/275.md +90 -0
  40. package/templates/.claude/skills/avatar-boot-starter-rocketmq/README.md +662 -0
  41. package/templates/.claude/skills/avatar-boot-starter-rocketmq/SKILL.md +48 -640
  42. package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//346/240/270/345/277/203/345/212/237/350/203/275.md +101 -0
  43. 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
  44. package/templates/.claude/skills/avatar-boot-starter-rocketmq/references//351/253/230/347/272/247/347/211/271/346/200/247.md +71 -0
  45. package/templates/.claude/skills/avatar-boot-starter-web/README.md +1007 -0
  46. package/templates/.claude/skills/avatar-boot-starter-web/SKILL.md +150 -1003
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. package/templates/.claude/skills/avatar-boot-starter-web/references//346/263/250/346/204/217/344/272/213/351/241/271.md +68 -0
  54. 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
  55. package/templates/.claude/skills/avatar-boot-starter-web/references//351/205/215/347/275/256/345/217/202/350/200/203.md +107 -0
  56. package/templates/.claude/skills/crud-generator/SKILL.md +133 -64
  57. package/templates/.claude/skills/database-design/README.md +207 -0
  58. package/templates/.claude/skills/database-design/SKILL.md +469 -82
  59. package/templates/.claude/skills/database-design/references//345/221/275/345/220/215/350/247/204/350/214/203.md +232 -0
  60. 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
  61. package/templates/.claude/skills/database-design/references//347/264/242/345/274/225/350/247/204/350/214/203.md +506 -0
  62. package/templates/avatar-scaffold-api/pom.xml +0 -5
  63. package/templates/avatar-scaffold-service/pom.xml +25 -87
  64. package/templates/avatar-scaffold-service/src/main/resources/application-dev.yaml +3 -5
  65. package/templates/avatar-scaffold-service/src/main/resources/application-local.yaml +2 -2
  66. package/templates/pom.xml +9 -18
@@ -1,437 +1,58 @@
1
1
  ---
2
2
  name: avatar-boot-starter-job
3
- description: 当使用 avatar-boot-starter-job 模块时使用此技能 - 为 Spring Boot 3.5.3 应用提供基于 XXL-Job 2.4.0 的分布式任务调度能力,包含自动配置、监控指标、AOP 拦截。
3
+ description: Avatar Boot XXL-Job 模块使用指南。当用户询问分布式任务调度、XXL-Job 配置、@XxlJob 注解、任务处理器编写、监控指标,或需要接入 avatar-boot-starter-job 时触发。
4
4
  ---
5
5
 
6
- Avatar Boot XXL-Job 分布式任务调度集成模块,提供开箱即用的任务调度能力和完善的监控指标。
6
+ # Avatar Boot Starter Job 使用指南
7
7
 
8
- ## 功能特性
8
+ 你是 Avatar Boot XXL-Job 模块的使用顾问与开发助手。
9
9
 
10
- - ✅ **零代码配置** - 基于 Spring Boot 自动配置机制,自动装配 XXL-Job 执行器
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
- ### 1. 添加依赖
14
+ 问题:"您好!我是 Avatar Boot XXL-Job 模块助手,请问您需要哪方面的帮助?"
15
+ 选项:
16
+ 1. **快速接入** - 添加依赖、配置执行器、编写任务处理器
17
+ 2. **任务编写** - 简单任务、带参数任务、分片任务、结果回调
18
+ 3. **配置说明** - 必填/可选配置项、多环境配置、禁用 XXL-Job
19
+ 4. **监控指标** - Micrometer 指标、Prometheus 查询、Grafana 面板
20
+ 5. **常见问题** - 执行器注册失败、任务无法触发、日志无法查看
21
21
 
22
- 在项目的 `pom.xml` 中添加依赖:
22
+ **根据用户选择,用 Read 工具按下方「文档读取路由」加载对应文档,然后给出具体指导。**
23
23
 
24
- ```xml
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
- @Slf4j
62
- @Component
63
- public class SampleJobHandler {
26
+ ## 行为准则
64
27
 
65
- /**
66
- * 简单任务示例
67
- */
68
- @XxlJob("demoJobHandler")
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
- ### 4. 在调度中心配置任务
39
+ | 用户需求 | 需读取的文件 |
40
+ |:--|:--|
41
+ | 快速接入 / 任务编写 / 配置说明 | `references/快速接入与配置.md` |
42
+ | 监控指标 | `references/监控指标.md` |
43
+ | 常见问题 | `references/常见问题.md` |
100
44
 
101
- 1. 登录 XXL-Job 调度中心
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` | 调度中心地址 | `http://localhost:8080/xxl-job-admin` |
115
- | `xxl.job.executor.appname` | 执行器名称 | `my-app-executor` |
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
- - [XXL-Job 官方文档](https://www.xuxueli.com/xxl-job/)
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` | 访问令牌 | 空 |