# Quartz 任务调度模块
Quartz 模块是 DarkM 框架的任务调度管理模块,基于 Quartz.NET 实现了可视化的定时任务管理系统。支持多种任务类型(代码任务、HTTP 任务)、丰富的触发器配置、执行日志记录等功能,满足各种定时任务需求。
# 📋 模块概述
| 属性 | 说明 |
|---|---|
| 模块名称 | Quartz(任务调度) |
| 模块类型 | 基础模块 |
| 依赖关系 | 依赖 Admin 模块 |
| 必需性 | 可选(推荐安装) |
| Git 仓库 | framework/darkm/darkm (opens new window) |
# 🎯 核心功能
# 功能清单
| 功能 | 说明 | 重要性 |
|---|---|---|
| 任务管理 | 定时任务的增删改查 | ⭐⭐⭐⭐⭐ |
| 任务组管理 | 任务分组管理 | ⭐⭐⭐⭐ |
| 代码任务 | 执行自定义代码任务 | ⭐⭐⭐⭐⭐ |
| HTTP 任务 | 执行 HTTP 请求任务 | ⭐⭐⭐⭐⭐ |
| 触发器配置 | Cron 表达式、简单触发器等 | ⭐⭐⭐⭐⭐ |
| 任务控制 | 暂停、恢复、停止任务 | ⭐⭐⭐⭐⭐ |
| 执行日志 | 详细的任务执行日志 | ⭐⭐⭐⭐ |
| 日志清理 | 自动清理历史日志 | ⭐⭐⭐ |
# 📦 安装配置
# NuGet 包安装
Install-Package DarkM.Module.Quartz.Web -Version 1.0.0
1
# NPM 包安装
npm i -S darkm-module-quartz
1
# 配置文件
{
"Db": {
"Modules": [
{
"Name": "Quartz",
"Database": "Nm_Quartz",
"Prefix": ""
}
]
},
"Quartz": {
// 是否开启任务调度
"Enable": true,
// 任务日志保留月数
"LogKeepMonths": 3,
// 是否开启日志自动清理
"EnableLogAutoClear": true
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
配置说明:
| 配置项 | 说明 | 默认值 |
|---|---|---|
Enable | 是否开启任务调度 | true |
LogKeepMonths | 任务日志保留月数 | 3 |
EnableLogAutoClear | 是否开启日志自动清理 | true |
# 🗄️ 数据库表结构
# 核心表
| 表名 | 说明 | 主键 |
|---|---|---|
Job | 任务信息表 | Id (Guid) |
JobLog | 任务执行日志表 | Id (Guid) |
JobHttp | HTTP 任务配置表 | Id (Guid) |
Group | 任务组表 | Id (Guid) |
# Quartz 系统表
| 表名 | 说明 |
|---|---|
QRTZ_CALENDARS | Quartz 日历表 |
QRTZ_FIRED_TRIGGERS | 已触发的触发器表 |
QRTZ_JOB_DETAILS | 任务详细信息表 |
QRTZ_LOCKS | 锁表 |
QRTZ_PAUSED_TRIGGER_GRPS | 暂停的触发器组表 |
QRTZ_SCHEDULER_STATE | 调度器状态表 |
QRTZ_SIMPLE_TRIGGERS | 简单触发器表 |
QRTZ_SIMPROP_TRIGGERS | 同步触发器表 |
QRTZ_TRIGGERS | 触发器表 |
# 🔐 权限系统设计
# Controller 定义
using System;
using System.ComponentModel;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using DarkM.Lib.Auth.Web.Attributes;
using DarkM.Lib.Utils.Core.Models;
namespace DarkM.Module.Quartz.Web.Controllers
{
[Description("任务管理")]
public class JobController : ModuleController
{
private readonly IJobService _service;
public JobController(IJobService service)
{
_service = service;
}
[HttpGet]
[Description("查询")]
public Task<IResultModel> Query([FromQuery]JobQueryModel model)
{
return _service.Query(model);
}
[HttpPost]
[Description("添加")]
public Task<IResultModel> Add(JobAddModel model)
{
return _service.Add(model);
}
[HttpGet]
[Description("编辑")]
public Task<IResultModel> Edit([BindRequired]Guid id)
{
return _service.Edit(id);
}
[HttpPost]
[Description("修改")]
public Task<IResultModel> Update(JobUpdateModel model)
{
return _service.Update(model);
}
[HttpDelete]
[Description("删除")]
public Task<IResultModel> Delete([BindRequired]Guid id)
{
return _service.Delete(id);
}
[HttpPost]
[Description("暂停")]
public Task<IResultModel> Pause([BindRequired]Guid id)
{
return _service.Pause(id);
}
[HttpPost]
[Description("恢复")]
public Task<IResultModel> Resume([BindRequired]Guid id)
{
return _service.Resume(id);
}
[HttpPost]
[Description("停止")]
public Task<IResultModel> Stop([BindRequired]Guid id)
{
return _service.Stop(id);
}
[HttpGet]
[Description("日志")]
public Task<IResultModel> Log([FromQuery]JobLogQueryModel model)
{
return _service.Log(model);
}
[HttpPost]
[Description("添加 HTTP 任务")]
public Task<IResultModel> AddHttpJob(JobHttpAddModel model)
{
return _service.AddHttpJob(model);
}
[HttpGet]
[Description("编辑 HTTP 任务")]
public Task<IResultModel> EditHttpJob([BindRequired]Guid id)
{
return _service.EditHttpJob(id);
}
[HttpPost]
[Description("修改 HTTP 任务")]
public Task<IResultModel> UpdateHttpJob(JobHttpUpdateModel model)
{
return _service.UpdateHttpJob(model);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# 权限解析结果
| 权限编码 | 说明 | 访问级别 |
|---|---|---|
quartz_job_query_get | 任务管理 - 查询 | 需授权 |
quartz_job_add_post | 任务管理 - 添加 | 需授权 |
quartz_job_edit_get | 任务管理 - 编辑 | 需授权 |
quartz_job_update_post | 任务管理 - 修改 | 需授权 |
quartz_job_delete_delete | 任务管理 - 删除 | 需授权 |
quartz_job_pause_post | 任务管理 - 暂停 | 需授权 |
quartz_job_resume_post | 任务管理 - 恢复 | 需授权 |
quartz_job_stop_post | 任务管理 - 停止 | 需授权 |
quartz_job_log_get | 任务管理 - 日志 | 需授权 |
quartz_job_addhttpjob_post | 任务管理 - 添加 HTTP 任务 | 需授权 |
# 🎨 核心功能详解
# 一、任务组管理
# 1. 创建任务组
public class GroupAddModel
{
/// <summary>
/// 组名称
/// </summary>
[Required]
[Length(100)]
public string Name { get; set; }
/// <summary>
/// 组编码
/// </summary>
[Required]
[Length(50)]
public string Code { get; set; }
/// <summary>
/// 描述
/// </summary>
[Length(500)]
public string Description { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 2. 任务组服务接口
public interface IGroupService
{
/// <summary>
/// 查询任务组列表
/// </summary>
Task<IResultModel> Query(GroupQueryModel model);
/// <summary>
/// 添加任务组
/// </summary>
Task<IResultModel> Add(GroupAddModel model);
/// <summary>
/// 删除任务组
/// </summary>
Task<IResultModel> Delete(Guid id);
/// <summary>
/// 获取下拉列表
/// </summary>
Task<IResultModel> Select();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 二、任务管理
# 1. 任务类型
| 类型 | 说明 | 适用场景 |
|---|---|---|
| 代码任务 | 执行自定义 C# 代码 | 数据处理、报表生成、文件清理等 |
| HTTP 任务 | 执行 HTTP 请求 | 调用外部 API、Webhook 通知等 |
# 2. 创建代码任务
public class JobAddModel
{
/// <summary>
/// 任务名称
/// </summary>
[Required]
[Length(100)]
public string Name { get; set; }
/// <summary>
/// 任务组 ID
/// </summary>
[Required]
public Guid GroupId { get; set; }
/// <summary>
/// 任务类型
/// </summary>
[Required]
public JobType JobType { get; set; }
/// <summary>
/// 任务类名(代码任务)
/// </summary>
[Length(200)]
public string JobClassName { get; set; }
/// <summary>
/// Cron 表达式
/// </summary>
[Length(100)]
public string CronExpression { get; set; }
/// <summary>
/// 是否启用
/// </summary>
public bool Enabled { get; set; }
/// <summary>
/// 描述
/// </summary>
[Length(500)]
public string Description { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 3. 任务类型枚举
public enum JobType
{
/// <summary>
/// 代码任务
/// </summary>
Code = 0,
/// <summary>
/// HTTP 任务
/// </summary>
Http = 1
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 4. 任务控制
// 暂停任务
[HttpPost]
[Description("暂停")]
public Task<IResultModel> Pause([BindRequired]Guid id)
{
return _service.Pause(id);
}
// 恢复任务
[HttpPost]
[Description("恢复")]
public Task<IResultModel> Resume([BindRequired]Guid id)
{
return _service.Resume(id);
}
// 停止任务
[HttpPost]
[Description("停止")]
public Task<IResultModel> Stop([BindRequired]Guid id)
{
return _service.Stop(id);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 三、HTTP 任务
# 1. HTTP 任务配置
public class JobHttpAddModel
{
/// <summary>
/// 任务 ID
/// </summary>
[Required]
public Guid JobId { get; set; }
/// <summary>
/// 请求 URL
/// </summary>
[Required]
[Length(500)]
public string Url { get; set; }
/// <summary>
/// 请求方法
/// </summary>
[Required]
public HttpMethod Method { get; set; }
/// <summary>
/// 请求头
/// </summary>
[Nullable]
public string Headers { get; set; }
/// <summary>
/// 请求体
/// </summary>
[Nullable]
public string Body { get; set; }
/// <summary>
/// 超时时间(秒)
/// </summary>
public int Timeout { get; set; } = 30;
/// <summary>
/// 认证类型
/// </summary>
public AuthType AuthType { get; set; }
/// <summary>
/// 认证 Token
/// </summary>
[Nullable]
[Length(500)]
public string AuthToken { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 2. 请求方法枚举
public enum HttpMethod
{
GET = 0,
POST = 1,
PUT = 2,
DELETE = 3,
PATCH = 4
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 3. 认证类型枚举
public enum AuthType
{
/// <summary>
/// 无认证
/// </summary>
None = 0,
/// <summary>
/// Bearer Token
/// </summary>
Bearer = 1,
/// <summary>
/// Basic Auth
/// </summary>
Basic = 2,
/// <summary>
/// API Key
/// </summary>
ApiKey = 3
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 四、任务日志
# 1. 日志查询
[HttpGet]
[Description("日志")]
public Task<IResultModel> Log([FromQuery]JobLogQueryModel model)
{
return _service.Log(model);
}
1
2
3
4
5
6
2
3
4
5
6
# 2. 日志内容
| 字段 | 说明 |
|---|---|
| JobId | 任务 ID |
| JobName | 任务名称 |
| StartTime | 开始时间 |
| EndTime | 结束时间 |
| Duration | 执行时长 |
| Status | 执行状态(成功/失败) |
| Message | 执行消息 |
| Exception | 异常信息 |
# 3. 日志自动清理
/// <summary>
/// 移动 Job 日志到备份表,默认只保留 3 个月
/// </summary>
Task ClearJobLogSyncTask(int KeepMonths = 3);
1
2
3
4
2
3
4
# 🔧 核心服务接口
# IJobService(任务服务)
public interface IJobService
{
/// <summary>
/// 查询任务列表
/// </summary>
Task<IResultModel> Query(JobQueryModel model);
/// <summary>
/// 添加任务
/// </summary>
Task<IResultModel> Add(JobAddModel model);
/// <summary>
/// 编辑任务
/// </summary>
Task<IResultModel> Edit(Guid id);
/// <summary>
/// 更新任务
/// </summary>
Task<IResultModel> Update(JobUpdateModel model);
/// <summary>
/// 删除任务
/// </summary>
Task<IResultModel> Delete(Guid id);
/// <summary>
/// 暂停任务
/// </summary>
Task<IResultModel> Pause(Guid id);
/// <summary>
/// 恢复任务
/// </summary>
Task<IResultModel> Resume(Guid id);
/// <summary>
/// 停止任务
/// </summary>
Task<IResultModel> Stop(Guid id);
/// <summary>
/// 查询日志
/// </summary>
Task<IResultModel> Log(JobLogQueryModel model);
/// <summary>
/// 添加 HTTP 任务
/// </summary>
Task<IResultModel> AddHttpJob(JobHttpAddModel model);
/// <summary>
/// 编辑 HTTP 任务
/// </summary>
Task<IResultModel> EditHttpJob(Guid id);
/// <summary>
/// 更新 HTTP 任务
/// </summary>
Task<IResultModel> UpdateHttpJob(JobHttpUpdateModel model);
/// <summary>
/// HTTP 任务详情
/// </summary>
Task<IResultModel> JobHttpDetails(Guid id);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# IGroupService(任务组服务)
public interface IGroupService
{
/// <summary>
/// 查询任务组列表
/// </summary>
Task<IResultModel> Query(GroupQueryModel model);
/// <summary>
/// 添加任务组
/// </summary>
Task<IResultModel> Add(GroupAddModel model);
/// <summary>
/// 删除任务组
/// </summary>
Task<IResultModel> Delete(Guid id);
/// <summary>
/// 获取下拉列表
/// </summary>
Task<IResultModel> Select();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 📊 使用流程
# 创建定时任务流程
1. 创建任务组(可选)
↓
2. 创建任务
↓
3. 配置触发器(Cron 表达式)
↓
4. 选择任务类型
├─ 代码任务:选择任务类
└─ HTTP 任务:配置请求参数
↓
5. 启用任务
↓
6. 查看执行日志
↓
7. 完成✅
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 示例 1:创建每日数据清理任务
# 步骤 1:创建任务组
组名称:数据清理
组编码:DataClean
描述:负责各类数据清理任务
1
2
3
2
3
# 步骤 2:创建代码任务
任务名称:清理 3 个月前日志
任务组:数据清理
任务类型:代码任务
任务类:DataCleanJob.CleanLogJob
Cron 表达式:0 0 2 * * ?(每天凌晨 2 点执行)
启用:是
1
2
3
4
5
6
2
3
4
5
6
# 步骤 3:编写任务代码
using System.Threading.Tasks;
using DarkM.Lib.Quartz.Abstractions;
namespace DataCleanJob
{
public class CleanLogJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
// 清理 3 个月前的日志
var threeMonthsAgo = DateTime.Now.AddMonths(-3);
// 清理操作日志
await _auditLogService.DeleteAsync(m => m.CreateTime < threeMonthsAgo);
// 清理登录日志
await _loginLogService.DeleteAsync(m => m.CreateTime < threeMonthsAgo);
Console.WriteLine($"日志清理完成,清理日期:{threeMonthsAgo}");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 示例 2:创建 HTTP 通知任务
# 步骤 1:创建 HTTP 任务
任务名称:企业微信通知
任务组:消息通知
任务类型:HTTP 任务
1
2
3
2
3
# 步骤 2:配置 HTTP 请求
{
"url": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx",
"method": "POST",
"headers": "{\"Content-Type\":\"application/json\"}",
"body": "{\"msgtype\":\"text\",\"text\":{\"content\":\"定时任务提醒\"}}",
"timeout": 30,
"authType": "None"
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 步骤 3:配置触发器
Cron 表达式:0 0 9 * * ?(每天早上 9 点执行)
启用:是
1
2
2
# 🖥️ 前端组件说明
# NPM 包信息
{
"name": "darkm-module-quartz",
"version": "1.5.0-beta-1.0",
"code": "quartz",
"title": "任务调度",
"dependencies": {
"darkm-module-admin": "^1.5.0-beta-1.0",
"darkm-ui": "^1.5.0-beta-1.0"
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 组件目录结构
src/UI/module-quartz/
├── src/
│ └── views/
│ ├── job/ # 任务管理
│ │ ├── index/
│ │ │ ├── index.vue # 任务列表页面
│ │ │ └── page.js # 页面配置和路由
│ │ └── components/ # 任务管理子组件
│ │ ├── add/ # 添加任务
│ │ ├── edit-normal/ # 编辑代码任务
│ │ ├── edit-http/ # 编辑 HTTP 任务
│ │ ├── log-list/ # 任务日志
│ │ └── http-details/ # HTTP 任务详情
│ └── group/ # 任务组管理
│ ├── index/
│ │ ├── index.vue # 任务组列表页面
│ │ └── page.js # 页面配置和路由
│ └── components/ # 任务组子组件
│ ├── add/ # 添加任务组
│ └── select/ # 任务组选择器
└── package.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
说明: Quartz 模块的组件主要组织在 views 目录下,每个功能模块包含:
index/- 主页面组件components/- 子组件(弹窗、选择器等)
# 📦 页面组件详解
# 1. 任务管理页面
组件路径: views/job/index
功能: 定时任务管理主页面,支持任务增删改查、暂停/恢复/停止、日志查看
使用示例:
<template>
<job-list />
</template>
<script>
import JobList from 'darkm-module-quartz/src/views/job/index'
export default {
components: { JobList }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
页面配置(page.js):
const page = new (function() {
this.title = '任务列表'
this.icon = 'list'
this.name = 'quartz_job'
this.path = '/quartz/job'
// 关联权限
this.permissions = [`${this.name}_query_get`, `${this.name}_JobHttpDetails_get`]
// 按钮配置
this.buttons = {
add: {
text: '添加',
type: 'success',
icon: 'add',
code: `${this.name}_add`,
permissions: [`${this.name}_add_post`, `${this.name}_addhttpjob_post`]
},
edit: {
text: '编辑',
type: 'text',
icon: 'edit',
code: `${this.name}_edit`,
permissions: [
`${this.name}_edit_get`,
`${this.name}_update_post`,
`${this.name}_edithttpjob_get`,
`${this.name}_updatehttpjob_post`
]
},
pause: {
text: '暂停',
type: 'text',
icon: 'pause',
code: `${this.name}_pause`,
permissions: [`${this.name}_pause_post`]
},
resume: {
text: '启动',
type: 'text',
icon: 'run',
code: `${this.name}_resume`,
permissions: [`${this.name}_resume_post`]
},
stop: {
text: '停止',
type: 'text',
icon: 'stop',
code: `${this.name}_stop`,
permissions: [`${this.name}_stop_post`]
},
log: {
text: '日志',
type: 'text',
icon: 'log',
code: `${this.name}_log`,
permissions: [`${this.name}_log_get`]
},
del: {
text: '删除',
type: 'text',
icon: 'delete',
code: `${this.name}_del`,
permissions: [`${this.name}_delete_delete`]
}
}
})()
export const route = {
page,
component: () => import(/* webpackChunkName: "Quartz.Job" */ './index')
}
export default page
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
子组件:
| 子组件路径 | 组件名称 | 功能 |
|---|---|---|
components/add | 添加任务 | 支持添加代码任务和 HTTP 任务 |
components/edit-normal | 编辑代码任务 | 编辑 Quartz 代码任务 |
components/edit-http | 编辑 HTTP 任务 | 编辑 HTTP 请求任务 |
components/log-list | 任务日志 | 查看任务执行历史 |
components/http-details | HTTP 任务详情 | 查看 HTTP 任务配置详情 |
components/job-select | 任务选择器 | 任务下拉选择 |
# 2. 任务组管理页面
组件路径: views/group/index
功能: 任务组管理主页面,支持任务组的添加、删除、选择
使用示例:
<template>
<group-list />
</template>
<script>
import GroupList from 'darkm-module-quartz/src/views/group/index'
export default {
components: { GroupList }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
页面配置(page.js):
const page = new (function() {
this.title = '任务分组'
this.icon = 'group'
this.name = 'quartz_group'
this.path = '/quartz/group'
// 关联权限
this.permissions = [`${this.name}_query_get`]
// 按钮配置
this.buttons = {
add: {
text: '添加',
type: 'success',
icon: 'add',
code: `${this.name}_add`,
permissions: [`${this.name}_add_post`]
},
del: {
text: '删除',
type: 'text',
icon: 'delete',
code: `${this.name}_del`,
permissions: [`${this.name}_delete_delete`]
}
}
})()
export const route = {
page,
component: () => import(/* webpackChunkName: "Quartz.Group" */ './index')
}
export default page
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
子组件:
| 子组件路径 | 组件名称 | 功能 |
|---|---|---|
components/add | 添加任务组 | 添加任务组弹窗 |
components/select | 任务组选择器 | 任务组下拉选择 |
# 📋 组件使用注意事项
# 1. 组件引入方式
// 方式一:直接引入页面组件
import JobList from 'darkm-module-quartz/src/views/job/index'
// 方式二:通过模块引入
import Quartz from 'darkm-module-quartz'
Vue.use(Quartz)
1
2
3
4
5
6
2
3
4
5
6
# 2. 路由配置
在路由中配置模块页面:
import QuartzJob from 'darkm-module-quartz/src/views/job/index/page.js'
const routes = [
{
path: '/quartz/job',
component: QuartzJob.route.component,
meta: QuartzJob.page
}
]
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 3. 权限配置
确保在 Admin 模块中配置对应权限:
// 任务管理权限
quartz_job_query_get // 查询
quartz_job_add_post // 添加
quartz_job_edit_get // 编辑
quartz_job_update_post // 修改
quartz_job_delete_delete // 删除
quartz_job_pause_post // 暂停
quartz_job_resume_post // 恢复
quartz_job_stop_post // 停止
quartz_job_log_get // 日志
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 4. 组件依赖
Quartz 模块依赖以下模块:
darkm-module-admin- 权限管理darkm-ui- UI 组件库
确保先安装依赖:
npm install darkm-module-admin --registry http://npm.woowis.com
npm install darkm-ui --registry http://npm.woowis.com
1
2
2
# 🔍 常见问题
# 🔍 常见问题
# 1. 任务不执行
问题: 任务创建后没有执行
解决:
# 检查 Quartz 是否启用
cat appsettings.json | grep -A 5 Quartz
# 检查任务是否启用
# 检查 Cron 表达式是否正确
# 检查任务类是否正确实现 IJob 接口
# 查看 Quartz 日志
tail -f logs/quartz.log
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 2. HTTP 任务请求失败
问题: HTTP 任务执行报错
解决:
- 检查 URL 是否正确
- 检查网络连接
- 检查认证信息是否正确
- 增加超时时间
- 查看任务日志中的异常信息
# 3. 任务日志过多
问题: JobLog 表数据量过大
解决:
// 开启日志自动清理
"Quartz": {
"EnableLogAutoClear": true,
"LogKeepMonths": 3 // 保留 3 个月
}
// 或手动清理
await _jobService.ClearJobLogSyncTask(3);
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 4. Cron 表达式不生效
问题: Cron 表达式配置后任务不执行
解决:
- 使用 Cron 表达式验证工具 (opens new window) 验证
- 检查时区设置
- 检查任务是否启用
- 重启服务后重试
# 📚 相关文档
- Admin 权限管理 - 权限配置
- Common 通用模块 - 通用功能
- 系统架构 - 整体架构
- 任务调度 - Quartz 框架
# 🔗 参考链接
- Quartz.NET 官方文档 (opens new window)
- Cron 表达式教程 (opens new window)
- ASP.NET Core 定时任务 (opens new window)
- GitLab 仓库 (opens new window)
最后更新: 2026-03-20