# quartz_demo **Repository Path**: code-zyk/quartz_demo ## Basic Information - **Project Name**: quartz_demo - **Description**: 建立一个 可 调度 的 quartz 定时器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-08 - **Last Updated**: 2026-04-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # QuartzDemo - .NET 8 集成 Quartz 定时任务示例 ## 功能说明 本项目实现了一个基于 .NET 8 + Quartz 的定时任务调度系统,主要功能: 1. **数据库持久化**:所有任务数据存储在 SQL Server 数据库中 2. **自动监听新记录**:通过 `DatabaseChangeListenerService` 监听 Test1 表的新增记录 3. **定时执行任务**:根据 Test1.TaskStartTime 在指定时间执行任务 4. **业务逻辑检查**:检查 Test1 关联的 Test2 数据数量是否大于阈值 5. **状态自动更新**:根据检查结果自动更新 Test1.Status 字段 ## 数据库表结构 ### Test1 表(任务主表) | 字段 | 类型 | 说明 | |------|------|------| | Id | int | 主键,自增 | | TaskStartTime | datetime | 任务开始时间 | | Status | nvarchar(50) | 状态:待执行、你真棒、你真菜 | | ThresholdValue | int | 阈值(默认10,可动态更改) | | IsExecuted | bit | 是否已执行 | | CreatedAt | datetime | 创建时间 | ### Test2 表(关联数据表) | 字段 | 类型 | 说明 | |------|------|------| | Id | int | 主键,自增 | | Test1Id | int | 外键,关联 Test1.Id | | Description | nvarchar(200) | 描述 | | CreatedAt | datetime | 创建时间 | ## 核心组件 1. **TaskCheckJob** - 执行具体检查逻辑的 Quartz Job 2. **DatabaseChangeListenerService** - 监听新插入的 Test1 记录 3. **TaskSchedulerService** - 轮询检查开始时间已到的任务 4. **AppDbContext** - Entity Framework Core 数据库上下文 ## 快速开始 ### 1. 执行数据库脚本 在 SQL Server Management Studio (SSMS) 中执行 `Scripts/CreateDatabase.sql` 脚本: ```sql -- 创建数据库(如果不存在) CREATE DATABASE QuartTt; USE QuartTt; -- 执行建表语句... ``` ### 2. 修改数据库连接字符串(如需要) 编辑 `appsettings.json` 文件: ```json { "ConnectionStrings": { "DefaultConnection": "Server=你的服务器;Database=QuartTt;Trusted_Connection=True;TrustServerCertificate=True;" } } ``` ### 3. 运行应用 ```bash dotnet run ``` ## 使用示例 ### 插入测试数据 直接在 SQL 中插入数据,程序会自动检测并创建定时任务: ```sql -- 插入 Test1 记录(任务开始时间为当前时间 + 1分钟) INSERT INTO Test1 (TaskStartTime, Status, ThresholdValue, IsExecuted) VALUES (DATEADD(MINUTE, 1, GETDATE()), N'待执行', 10, 0); -- 插入对应的 Test2 记录 DECLARE @Test1Id INT = SCOPE_IDENTITY(); INSERT INTO Test2 (Test1Id, Description) VALUES (@Test1Id, N'测试数据'); INSERT INTO Test2 (Test1Id, Description) VALUES (@Test1Id, N'测试数据'); INSERT INTO Test2 (Test1Id, Description) VALUES (@Test1Id, N'测试数据'); -- ... 插入更多记录 -- 1分钟后,程序会自动检查: -- 如果 Test2 数量 >= 10,更新 Status 为 "你真棒" -- 如果 Test2 数量 < 10,更新 Status 为 "你真菜" ``` ### 动态更改阈值 ```sql -- 直接修改阈值 UPDATE Test1 SET ThresholdValue = 5 WHERE Id = 1; ``` ## 项目结构 ``` Quartz_Test/ ├── Models/ │ ├── Test1.cs # 任务实体 │ └── Test2.cs # 关联数据实体 ├── Data/ │ └── AppDbContext.cs # 数据库上下文 ├── Jobs/ │ └── TaskCheckJob.cs # 定时任务执行逻辑 ├── Services/ │ ├── TaskSchedulerService.cs # 任务调度服务 │ └── DatabaseChangeListenerService.cs # 数据库变更监听 ├── Scripts/ │ └── CreateDatabase.sql # 数据库建表脚本 ├── appsettings.json # 配置文件 ├── Program.cs # 程序入口 └── QuartzDemo.csproj # 项目文件 ``` ## 工作流程 ``` ┌─────────────────┐ ┌──────────────────────┐ ┌─────────────────┐ │ 用户插入 Test1 │────▶│ DatabaseChangeListener │────▶│ 创建 Quartz Job │ │ 记录到数据库 │ │ Service │ │ (延迟到TaskStartTime) └─────────────────┘ └──────────────────────┘ └────────┬────────┘ │ ┌─────────────────┐ ┌──────────────────────┐ │ │ Task1已到开始 │────▶│ TaskScheduler │◀─────────────┘ │ 时间但未执行 │ │ Service │ └─────────────────┘ └──────────┬───────────┘ │ ▼ ┌────────────────────────┐ │ TaskCheckJob │ │ 1. 检查Test2数量 │ │ 2. 比较是否>=阈值 │ │ 3. 更新Test1.Status │ └────────────────────────┘ ``` ## 配置说明 ### appsettings.json ```json { "ConnectionStrings": { "DefaultConnection": "Server=DONOTHINGOK;Database=QuartTt;Trusted_Connection=True;TrustServerCertificate=True;" }, "Logging": { "LogLevel": { "Default": "Information" } } } ``` ### 服务配置 | 服务 | 轮询间隔 | 说明 | |------|----------|------| | DatabaseChangeListenerService | 5秒 | 检测新插入的 Test1 记录 | | TaskSchedulerService | 10秒 | 检测开始时间已到的任务 | ## 注意事项 1. **任务只执行一次**:每个 Test1 记录只会触发一次任务检查 2. **IsExecuted 标志**:防止重复执行 3. **实时监听**:插入新记录后,程序会自动检测并创建定时任务 4. **支持批量数据**:无论 Test1 还是 Test2 都支持大量数据