@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
@@ -0,0 +1,437 @@
1
+ ---
2
+ name: avatar-boot-starter-job
3
+ description: 当使用 avatar-boot-starter-job 模块时使用此技能 - 为 Spring Boot 3.5.3 应用提供基于 XXL-Job 2.4.0 的分布式任务调度能力,包含自动配置、监控指标、AOP 拦截。
4
+ ---
5
+
6
+ Avatar Boot 的 XXL-Job 分布式任务调度集成模块,提供开箱即用的任务调度能力和完善的监控指标。
7
+
8
+ ## 功能特性
9
+
10
+ - ✅ **零代码配置** - 基于 Spring Boot 自动配置机制,自动装配 XXL-Job 执行器
11
+ - ✅ **原生配置兼容** - 使用 XXL-Job 原生配置属性(xxl.job.*),无需学习新配置
12
+ - ✅ **条件装配** - 支持通过 `enabled` 开关控制是否启用
13
+ - ✅ **AOP 监控** - 自动拦截 @XxlJob 方法,记录执行指标
14
+ - ✅ **Micrometer 集成** - 内置任务执行和执行器状态监控指标
15
+ - ✅ **优雅日志** - 清晰的启动和执行日志,便于问题排查
16
+ - ✅ **完全兼容** - 100% 兼容 XXL-Job 原生注解和功能
17
+
18
+ ## 快速开始
19
+
20
+ ### 1. 添加依赖
21
+
22
+ 在项目的 `pom.xml` 中添加依赖:
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;
60
+
61
+ @Slf4j
62
+ @Component
63
+ public class SampleJobHandler {
64
+
65
+ /**
66
+ * 简单任务示例
67
+ */
68
+ @XxlJob("demoJobHandler")
69
+ public void demoJobHandler() {
70
+ log.info("XXL-JOB, Hello World.");
71
+ }
72
+
73
+ /**
74
+ * 带参数的任务示例
75
+ */
76
+ @XxlJob("paramJobHandler")
77
+ public void paramJobHandler() {
78
+ String param = XxlJobHelper.getJobParam();
79
+ log.info("XXL-JOB, 接收参数: {}", param);
80
+ }
81
+
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
+ ```
93
+
94
+ **重要说明:**
95
+ - 任务处理器类必须被 Spring 管理(添加 `@Component` 注解)
96
+ - `@XxlJob` 注解的值必须与调度中心配置的 JobHandler 名称一致
97
+ - 监控指标会自动记录所有 @XxlJob 方法的执行情况
98
+
99
+ ### 4. 在调度中心配置任务
100
+
101
+ 1. 登录 XXL-Job 调度中心
102
+ 2. 执行器管理 -> 新增执行器(AppName 与配置文件中的 `appname` 一致)
103
+ 3. 任务管理 -> 新增任务
104
+ - JobHandler: `demoJobHandler`(与 @XxlJob 注解的值一致)
105
+ - 调度类型: CRON
106
+ - Cron: `0 0/1 * * * ?`(每分钟执行一次)
107
+
108
+ ## 配置说明
109
+
110
+ ### 必填配置
111
+
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
432
+
433
+ ## 参考文档
434
+
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)