首页 > 其他分享 >.NET Core项目使用Quartz实现简单的调度任务

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

时间:2022-09-22 15:58:24浏览次数:47  
标签:Core Quartz dbo -- UnityContainer var NET NULL public

创建一个.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)
        { 
            //防止程序退出
        }
    }
}

效果:

 

标签:Core,Quartz,dbo,--,UnityContainer,var,NET,NULL,public
From: https://www.cnblogs.com/code-porter-233/p/16719566.html

相关文章

  • 一套.NET Core +WebAPI+Vue前后端分离权限框架
    今天给大家推荐一个基于.NetCore开发的企业级的前后端分离权限框架。项目简介这是基于.NetCore开发的、构建的简单、跨平台、前后端分离的框架。此项目代码清晰、层......
  • Centos关闭telnet服务
    1、关闭telnet有两种方法方法一:#vi/etc/xinetd.d/telnet 将disable=no改为  disable=yes方法二:#chkconfigtelnetoff 2、重启#servicexinetdrestar......
  • Kubernetes 业务流程协调程序
    在基于微服务的开发方法中,每个微服务都有自己的模型和数据,因此从开发和部署角度来看,它具有自主性,独立于其他微服务。在容器内部托管微服务是实现此目的的常见方法。这些......
  • .NET连接SAP系统专题
    .NET连接SAP系统专题:SAP中新建可远程调用的RFC(二)发布于2022-05-1013:58:05阅读 1700   何谓RFC,就是一个Function,可以被非SAP系统调用,比如VB,C#,Java等。如......
  • .NET连接SAP系统专题:.NET调用RFC几种方式(一)
    来今天是要写一篇关于NCO3.0的东西,就是关乎.NET调用SAP的RFC的,支持VS2010和.NET4.0等。现在网上到处都是充斥着NCO1.X和NCO2.0,需要用VS2003来使用,都是一些没什么大用的东......
  • Kubernetes(K8s)部署 SpringCloud
    1.概述老话说的好:有可能性就不要放弃,要敢于尝试。言归正传,之前我们聊了一下如何在Kubernetes(K8s)中部署容器,今天我们来聊一下如何将SpringCloud的服务部署到Kubern......
  • asp.net超大文件上传和断点续传的实现
    ​以ASP.NETCoreWebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API,包括文件的上传和下载。 准备文件上传的API #region 文件上传 ......
  • CISO 需考虑的五项 Kubernetes 安全措施
    随着企业对软件开发的安全意识提高,开发和运维环节中各个团队也开始将安全嵌入他们正在使用或处理的平台或应用程序架构中。不同于各团队把对安全的关注放在自己所处理的环......
  • linux端口查看-netstat
    netstatnetstat命令用于显示与IP、TCP、UDP、ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接......
  • nxopen ug8.5 vb.net 定位块底面打孔工具
    OptionStrictOffImportsSystemImportsNXOpenImportsNXOpen.BlockStylerImportsNXOpen.UFImportsSystem.Collections.Generic'----------------------------......