C# quartz.net 定时任务(二)

4 篇文章 1 订阅

 

目录

 

 

Trigger

属性

SimpleTrigger

CronTrigger

 

Trigger、Job、Schedule Listiners

JobStore

RAMJobStore

ADO.NET Job Store(AdoJobStore)


Trigger

属性

所有Trigger都实现ITrigger,看下ITrigger就能知道Trigger的基本属性

TriggerKey  最开始的示例代码有,是Trigger的Identity

JobDataMap  上面提到过

JobKey  关联对应JobKey的Job

StartTimeUtc  Trigger如果多次触发,那么从这一天开始(例如设置了2020年6月30号,那么2020年6月30号之前是不会触发的)

EndTimeUtc  同上,从这一天结束,不再触发Trigger

Priority  默认是5,多个Trigger同时触发,竞争线程的时候,Priority越大执行优先度越高

MisFire Instructions 当多个trigger同时触发,有的trigger不能及时触发,会出现misfire instructions 不同的trigger type对应不同的misfire 之后再讲

Calendars  实现了ICalendar接口的类对象,可以用来排除特定日期(比如Trigger设置的每天执行,但是用来排除特定的节假日!)

使用scheduler的AddCalendar方法来初始化Calendar,(官方提供HolidayCalendar来排除节假日,TODO)

quartz.impl.calendar明明空间提供了一系列的ICalendar实现类,可能会满足需求(TODO)

SimpleTrigger

正如命名所示,较为简单的场景可以使用SimpleTrigger就可以了(单次执行的任务  和  按照简单规则多次执行的任务)

需要使用WithSimpleSchedule方法

可以看到源代码中定义如下:

public static TriggerBuilder WithSimpleSchedule(this TriggerBuilder triggerBuilder, Action<SimpleScheduleBuilder> action);

WithSimpleScheduleTriggerBuilder的一个扩展方法,需要一个Action参数

示例:

class Program
    {
        public static async Task Main(string[] args)
        {
            Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            IScheduler scheduler=await schedulerFactory.GetScheduler();
            await scheduler.Start();

            IJobDetail job = JobBuilder.Create<TestJob>()
                .WithIdentity("testJob", "testGroup")
                .Build();
            
            //每5秒执行1次(WithInternvalInSeconds)
            //重复2次(一共执行3次,如果WithRepeatCount是0,那么只会执行1次!)
            //从现在开始10秒后触发(StartAt)
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("testTrigger", "testGroup")
                .WithSimpleSchedule(x=>x.WithIntervalInSeconds(5).WithRepeatCount(2))
                .StartAt(DateTime.Now.AddSeconds(10))
                .Build();

            await scheduler.ScheduleJob(job, trigger);
            Console.ReadLine();
        }
    }

    public class TestJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Console.Out.WriteLineAsync("executeJob:"+ DateTime.Now.ToString("HH:mm:ss"));//每5秒打印一次 一共打印了3次 第一次距main方法10秒
        }
    }

上面的WithRepeatCount 方法指定了重复的次数,使用RepeatForever方法可以永远执行下去

 在WithSimpleSchedule方法中可以手动指定MisfirePolicy,所有的trigger默认都使用smart policy,也可以手动指定

x=>x.WithMisfireXXXXX  这样的形式来指定

DateBuilder是quartz提供的一个时间工具类,可以很方便的构建一个日期,配合StartAt方法使用!

CronTrigger

可以使用cron表达式的复杂Trigger

所有的触发情况基本都可以使用CronTrigger来满足需求(需要反复执行的任务)

在线Cron表达式生成地址:https://qqe2.com/cron

一个简单的cron表达式示例:

0 30 23 * * ? 

代表每天晚上23:30:00会出发一次trigger

Cron表达式包含7个部分,每个部分用空格隔开:

  • 小时
  • 日(每月第几天)
  • 月份
  • 周(每周第几天)
  • 年份(可以省略)

cron表达式这里就不再展开了,反正可以直接在线生成~~~

创建CronTrigger的方法:

使用TriggerBuilderBuild方法,创建过程中使用WithCronSchedule方法

也可以直接使用WithSchedule方法使用CronScheduleBuilder

WithCronSchedule示例:

ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("testTrigger", "testGroup")
                .WithCronSchedule("0/5 * * * * ? ")
                .StartAt(DateTime.Now.AddSeconds(5))
                .Build();//从每分钟的0秒开始 每5秒执行一次  (开始时间是startat指定时间)

CronScheduleBuilder示例:

ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("testTrigger", "testGroup")
                .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(23,30))
                .Build();//每天23:30执行一次

注意有一个InTimeZone方法,可以让出发时间不按照系统时间来计算,而是按照指定的TimeZone来

Misfire属性用法和SimpleTrigger差不多,也是在WithCronSchedule中指定,这里先不详细说。

 

Trigger、Job、Schedule Listiners

自定义监听器基本用不到。

可以自定义Tigger和Job的监听器,分别实现ITriggerListenerIJobListener接口就可以了,

也可也选择继承TriggerListenerSupportJobListenterSupport类,然后只override需要修改的event就可以了。

可以监听Trigger的Fire、Misfire、Complete(job完成了)

和Job的 将要执行前(to be executed) 、完成执行(completed execution)

自定义监听器在scheduler的ListennerManager上注册(运行时注册),必须要指定Name属性!

scheduler.ListenerManager.AddJobListner(.......);

注意:自定义的监听器,不允许抛出异常,所有异常需要在内部用try catch解决,否则会导致程序失败!

 ISchedulerListener是自定义scheduler监听器要实现的接口,也使用scheduler的ListenerManager注册(AddSchedulerListener方法)

监听scheduler的   添加job/trigger、移除job/trigger、shutdown通知、内部报错等等

JobStore

jobstore是用来存储scheduler相关的 数据(jobs、triggers、calendars等等)

注意不要在业务代码中使用JobStore,一开始配置好就行了(配置SchedulerFactory),大部分情况不要去配置

RAMJobStore

 Quartz框架默认使用RAMJobStore,正如命名一样,它保证数据都存储在内存中。

一把情况当你使用StdSchedulerFactory的时候,不需要指定使用RAMJobStore(quartz.jobStore.Type=Quartz.Simpl.RAMJobStore)

当然存在内存中,重启就没了。

ADO.NET Job Store(AdoJobStore)

如名称所述,将状态数据存数据库里面,因为这样访问硬盘了所以速度远比ram慢,要设置Ado

先要在数据库里面跑一下官方提供的脚步来创建相应的数据库表(官方项目的database/dbtables文件夹下,所有表QRTZ_开头)

JobStoreTX是这时候要使用的adojobstore实现类。配置方法如下:

quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz

DriverDelegate负责完成与数据库交互(ADO.NET)相关的工作,配置方法如下:(STDAdoDelegate是系统提供的实现)

quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz

配置数据库前缀(默认是QRTZ_, 你也可以自己修改数据库)

quartz.jobStore.tablePrefix = QRTZ_

 配置Data Source

quartz.jobStore.dataSource = myDS

 配置数据库连接示例:(sqlserver  mysql  oracle都支持)

 quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartz;Uid=quartznet;Pwd=quartznet
 quartz.dataSource.myDS.provider = MySql

 官方建议将userProperties属性设置为true,JobDataMap里面的参数全部都要是字符串

quartz.jobStore.useProperties = true
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# Quartz是一个强大、开源、轻量的作业调度框架,可以用于定时执行任务。具体而言,你可以将要定时执行的任务代码写到实现了IJob接口的Execute方法,当时间到达后,任务会自动执行。 以下是创建和执行C# Quartz定时任务的步骤: 1. 创建一个调度单元,可以使用StdSchedulerFactory类的GetDefaultScheduler方法来获取默认调度器。 2. 创建一个具体的作业(job),这个作业需要实现IJob接口,并且将任务代码写在其Execute方法。 3. 创建并配置一个触发器(trigger),定义任务的执行时间。可以使用TriggerBuilder类的Create方法来创建触发器,并使用WithCronSchedule方法来指定任务的执行时间表达式。 4. 将作业和触发器加入到作业调度池,使用调度器的ScheduleJob方法。 5. 开启调度器,使用调度器的Start方法。 下面是一个示例代码,展示了如何使用C# Quartz进行定时任务的创建和执行: ```csharp public class ScheduleManage { public static void Show() { // 创建调度单元 Task<IScheduler> tsk = StdSchedulerFactory.GetDefaultScheduler(); IScheduler scheduler = tsk.Result; // 创建一个具体的作业 IJobDetail job = JobBuilder.Create<SendMessageJob>() .WithIdentity("完成") .Build(); // 创建并配置一个触发器 ITrigger _CronTrigger = TriggerBuilder.Create() .WithIdentity("定时确认") .WithCronSchedule("0/2 * * * * ?") // 每2秒执行一次 .Build() as ITrigger; // 将作业和触发器加入到作业调度池 scheduler.ScheduleJob(job, _CronTrigger); // 开启调度 scheduler.Start(); Console.ReadLine(); } } ``` 请注意,以上代码仅为示例,实际使用时需要根据具体需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值