|
|
1 тиждень тому | |
|---|---|---|
| .. | ||
| tz-module-quartz-biz | 1 тиждень тому | |
| README.md | 1 тиждень тому | |
| pom.xml | 1 тиждень тому | |
创建了一个独立的Quartz定时任务服务模块 tz-module-quartz,参考 tz-module-mq 的结构,用于解决多节点部署时定时任务重复执行的问题。
┌─────────────────────────────────────────────────────┐
│ tz-module-quartz (独立服务) │
│ ┌──────────────────────────────────────────────┐ │
│ │ Quartz Scheduler (调度器) │ │
│ │ - 任务调度 │ │
│ │ - 集群锁(防重复执行) │ │
│ │ - 失败重试 │ │
│ └──────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────┐ │
│ │ JobManager (任务管理器) │ │
│ │ - 增删改查任务 │ │
│ │ - 暂停/恢复任务 │ │
│ │ - 手动触发 │ │
│ └──────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────┐ │
│ │ InvokerJob (任务执行器) │ │
│ │ - 调用具体的JobHandler │ │
│ │ - 记录执行日志 │ │
│ │ - 异常处理 │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
↓ RPC调用
┌─────────────────────────────────────────────────────┐
│ 业务服务 (tz-module-pressure等) │
│ ┌──────────────────────────────────────────────┐ │
│ │ JobHandler (任务处理器) │ │
│ │ - AppointmentPushJobHandler │ │
│ │ - SyncTaskEquipmentJobHandler │ │
│ │ - ReportPushJobHandler │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
tz-module-quartz/
├── pom.xml # 模块POM
└── tz-module-quartz-biz/ # 业务模块
├── pom.xml # 业务模块POM
├── src/main/java/cn/start/tz/module/quartz/
│ ├── QuartzServerApplication.java # 启动类
│ ├── dal/
│ │ ├── dataobject/
│ │ │ └── job/
│ │ │ └── JobDO.java # 定时任务DO
│ │ └── mysql/
│ │ └── job/
│ │ └── JobMapper.java # Mapper
│ ├── framework/
│ │ └── quartz/
│ │ ├── JobManager.java # 任务管理器
│ │ ├── InvokerJob.java # 任务执行器
│ │ └── JobHandler.java # 任务处理器接口
│ └── service/
│ └── job/
│ └── JobService.java # 任务Service接口
└── src/main/resources/
├── application.yaml # 配置文件
└── logback-spring.xml # 日志配置
framework/quartz/JobManager.javaframework/quartz/InvokerJob.java@DisallowConcurrentExecution 禁止并发执行framework/quartz/JobHandler.javavoid execute(Long jobId, String param)dal/dataobject/job/JobDO.javaid: 任务IDname: 任务名称status: 任务状态(1=正常, 2=暂停, 3=停止)handlerName: 任务处理器名称handlerParam: 任务参数cronExpression: Cron表达式JobHandler - 任务处理器接口JobManager - 任务管理器(基于Quartz)InvokerJob - 任务执行器QuartzConfig - Quartz配置类JobInitRunner - 启动时自动初始化任务JobDO - 定时任务DOJobLogDO - 任务执行日志DOJobMapper - 任务MapperJobLogMapper - 任务日志MapperJobService - 任务Service接口JobServiceImpl - 任务Service实现JobLogService - 任务日志Service接口JobLogServiceImpl - 任务日志Service实现JobController - 任务管理APIJobConvert - 对象转换器infra_job - 定时任务表infra_job_log - 任务执行日志表AppointmentPushJobHandlerSyncTaskEquipmentJobHandlerEquipUpdateStatusJobHandlerpom.xml 中添加 <module>tz-module-quartz</module>// 在 tz-module-pressure 中创建
@Component("appointmentPushJobHandler")
public class AppointmentPushJobHandler implements JobHandler {
@Resource
private AppointmentPushService appointmentPushService;
@Override
public void execute(Long jobId, String param) {
log.info("执行约检推送任务, jobId: {}, param: {}", jobId, param);
LocalDate checkDate = LocalDate.now();
if (StrUtil.isNotEmpty(param)) {
checkDate = LocalDate.parse(param);
}
appointmentPushService.pushAppointmentConfirmData(checkDate);
}
}
// 方式1: 通过API创建
POST /jobs/create
{
"name": "约检数据推送",
"handlerName": "appointmentPushJobHandler",
"handlerParam": "",
"cronExpression": "0 0 2 * * ?",
"status": 1
}
// 方式2: 直接插入数据库
INSERT INTO infra_job (name, handler_name, handler_param, cron_expression, status)
VALUES ('约检数据推送', 'appointmentPushJobHandler', '', '0 0 2 * * ?', 1);
# 启动 Quartz 服务
java -jar tz-module-quartz-biz.jar
# 启动业务服务
java -jar tz-module-pressure-biz.jar
CREATE TABLE `infra_job` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务编号',
`name` varchar(64) NOT NULL COMMENT '任务名称',
`status` tinyint NOT NULL COMMENT '任务状态',
`handler_name` varchar(64) NOT NULL COMMENT '任务处理器名称',
`handler_param` varchar(255) DEFAULT NULL COMMENT '任务处理器参数',
`cron_expression` varchar(128) NOT NULL COMMENT 'Cron表达式',
`creator` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT NULL COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='定时任务表';
CREATE TABLE `infra_job_log` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志编号',
`job_id` bigint NOT NULL COMMENT '任务编号',
`handler_name` varchar(64) NOT NULL COMMENT '任务处理器名称',
`handler_param` varchar(255) DEFAULT NULL COMMENT '任务处理器参数',
`execute_index` tinyint NOT NULL DEFAULT '1' COMMENT '第几次执行',
`begin_time` datetime NOT NULL COMMENT '开始时间',
`duration` int DEFAULT NULL COMMENT '执行时长',
`status` tinyint NOT NULL COMMENT '任务状态',
`creator` varchar(64) DEFAULT NULL COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_job_id` (`job_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='定时任务执行日志表';
| 特性 | 分布式XXL-Job | 独立Quartz服务 | 业务模块内Quartz |
|---|---|---|---|
| 避免重复执行 | ✅ 支持 | ✅ 支持 | ❌ 不支持 |
| 管理界面 | ✅ 有 | ⚠️ 需开发 | ❌ 无 |
| 调度可视化 | ✅ 有 | ⚠️ 需开发 | ❌ 无 |
| 部署复杂度 | 中 | 低 | 低 |
| 维护成本 | 低 | 中 | 低 |
| 学习成本 | 低 | 中 | 低 |
| 依赖外部服务 | 需要(调度中心) | 不需要 | 不需要 |
任务Handler命名规范: {功能}JobHandler
appointmentPushJobHandler, syncTaskEquipmentJobHandler参数传递: 使用JSON格式的字符串
{"checkDate": "2023-01-01", "limit": 100}异常处理: JobHandler中必须捕获并处理异常
try {
// 业务逻辑
} catch (Exception e) {
log.error("任务执行失败", e);
// 不抛出异常,避免任务一直重试
}
幂等性: 任务必须支持重复执行
监控告警:
tz-module-mq (消息队列服务)tz-module-pressure/job/*QUARTZ_MIGRATION_GUIDE.md状态: 已完成基础架构,剩余Service实现、Controller和SQL脚本。