code-porter-233

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

统计

.NET Core项目使用Quartz实现简单的调度任务

创建一个.NET Core 3.1控制台应用程序。

引入项目所需的依赖:

dotnet add package Unity
dotnet add package Quartz
dotnet add package Microsoft.EntityFrameworkCore 3.1.0
dotnet add package Microsoft.EntityFrameworkCore.SqlServer 3.1.0

新建一张表用来存放任务配置:

复制代码
-- ----------------------------
-- Table structure for bjScheduleConfigModel
-- ----------------------------
IF EXISTS (SELECT * FROM sys.all_objects WHERE object_id = OBJECT_ID(N'[dbo].[ScheduleConfigModel]') AND type IN ('U'))
    DROP TABLE [dbo].[bjScheduleConfigModel]
GO

CREATE TABLE [dbo].[ScheduleConfigModel] (
  [ScheduleConfigId] int  IDENTITY(1,1) NOT NULL,
  [JobName] varchar(50) COLLATE Chinese_PRC_CI_AS  NOT NULL,
  [CronExpression] varchar(20) COLLATE Chinese_PRC_CI_AS  NOT NULL,
  [Enable] int  NOT NULL,
  [LastExecuteTime] datetime  NULL,
  [CreateDate] datetime  NOT NULL,
  [CreateBy] varchar(50) COLLATE Chinese_PRC_CI_AS  NOT NULL,
  [UpdateDate] datetime  NOT NULL,
  [UpdateBy] varchar(50) COLLATE Chinese_PRC_CI_AS  NOT NULL
)
GO

ALTER TABLE [dbo].[bjScheduleConfigModel] SET (LOCK_ESCALATION = TABLE)
GO


-- ----------------------------
-- Primary Key structure for table bjScheduleConfigModel
-- ----------------------------
ALTER TABLE [dbo].[ScheduleConfigModel] ADD CONSTRAINT [PK_ScheduleConfigModel] PRIMARY KEY CLUSTERED ([ScheduleConfigId])
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)  
ON [PRIMARY]
GO
复制代码

新建DbContext类:

复制代码
public class ScheduleDbContext : DbContext
{
  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
   {
     base.OnConfiguring(optionsBuilder);
      optionsBuilder.UseSqlServer("Server={{IP}};Database={{databaseName}};User ID={{username}};Password={{password}};");
   }
   
  public DbSet<ScheduleConfigModel> ScheduleConfigDbSet { get; set; }
}
复制代码

新建ScheduleContainer类(依赖注入):

复制代码
public class ScheduleContainer
{
    private ScheduleContainer()
    {

    }

    private static IUnityContainer UnityContainer { get; set; }

    public static IUnityContainer CreateInstance()
    {
        if (UnityContainer == null)
        {
            UnityContainer = new UnityContainer();
            UnityContainer.RegisterType<ScheduleDbContext>();

            var stdSchedulerFactory = new StdSchedulerFactory();
            UnityContainer.RegisterInstance<ISchedulerFactory>(stdSchedulerFactory);
        }

        return UnityContainer;
    }
}
复制代码

新建一个Job任务类:

复制代码
public class TestJob : IJob
{
    public Task Execute(IJobExecutionContext context)
    {
        return Task.Factory.StartNew(() =>
        {
            string executeTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            Console.WriteLine($"Job:TestJob, execute time: {executeTime}");
        });
    }
}
复制代码

下面开始编写任务调度代码:

复制代码
public class Schedule
{
    public static async void Start()
    {
        IUnityContainer container = ScheduleContainer.CreateInstance();
        ISchedulerFactory schedulerFactory = container.Resolve<ISchedulerFactory>();
        IScheduler scheduler = await schedulerFactory.GetScheduler();
        await scheduler.Start();

        Console.WriteLine("任务调度器已启动");

        ScheduleDbContext context = container.Resolve<ScheduleDbContext>();
        List<ScheduleConfigModel> configs = context.ScheduleConfigDbSet.Where(e => e.Enable == 1).ToList();

        foreach (var config in configs)
        {
            var type = Type.GetType(string.Format("JobService.Jobs.{0}", config.JobName));
            var job = JobBuilder.Create(type).Build();
            var tigger = TriggerBuilder.Create().WithCronSchedule(config.CronExpression).Build();

            await scheduler.ScheduleJob(job, tigger);

            Console.WriteLine($"Job:{config.JobName}添加任务调度成功");
        }

        while (!scheduler.IsShutdown)
        { 
            //防止程序退出
        }
    }
}
复制代码

效果:

 

posted on   瞬间空白  阅读(261)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示