第九节:Quartz中的作业
程序员文章站
2022-04-13 19:16:59
...
做为使用quartz的我们,其实最关心的就job,job里面会实现我们要执行的业务代码,相对于调度器触发器来讲,job相对简单一些。
先睹图为快:
我们继承IJob接口定义的job会被封装到JobDetailImpl中,JobDetailImpl还包括其它属性,比如唯一标识job的JobKey(如上图),可见记录job状态的JobDataMap(如上图),还有就是是否支持持久化,Ijob,等等一些其它的属性
至于IJobExecutionContext可以叫做job执行上下文,里面比如会有当前的触发器,当前作业,调度器这些东东。
当初始化IJobDetail的时候是用JobBuilder来完成的。
比如:IJobDetail myJob =JobBuilder.Create<MyJob>().WithIdentity("j1").Build();
前面几节大家已经会实现自己的job了,今天来实现一个能记录执行过程中的数据的job,很简单,直接看代码吧:
1:job代码(和旧版的写法不一样):
- [PersistJobDataAfterExecution]//保存执行状态
- [DisallowConcurrentExecution]//不允许并发执行
- public class MyJob : IJob
- {
- public void Execute(IJobExecutionContext context)
- {
- int exeCount = context.JobDetail.JobDataMap.GetInt("exeCount");
- Console.WriteLine("我执行了,时间:{0} 第{1}次执行", DateTime.Now, exeCount);
- context.JobDetail.JobDataMap.Put("exeCount", ++exeCount);
- }
- }
2:调度代码:
- static void Main(string[] args)
- {
- //调度器
- ISchedulerFactory sf = new StdSchedulerFactory();
- IScheduler sched = sf.GetScheduler();
- //job详情,注意MyJob
- IJobDetail myJob = JobBuilder.Create<MyJob>()
- .WithIdentity("j1")
- .Build();
- //触发器,用的简单触发器,每隔5秒执行一次
- ITrigger trigger = TriggerBuilder.Create().WithSimpleSchedule(t => t.RepeatForever().WithIntervalInSeconds(5))
- .WithIdentity("t1")
- .Build();
- //关联job和触发器
- sched.ScheduleJob(myJob, trigger);
- //执行
- sched.Start();
- Console.Read();
- //关掉
- sched.Shutdown(true);
- }
3执行结果 :
总结:进一步了解了作业原理。
全部代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using Quartz.Impl;
- namespace Quartz.Demo
- {
- class Class5
- {
- static void Main(string[] args)
- {
- //调度器
- ISchedulerFactory sf = new StdSchedulerFactory();
- IScheduler sched = sf.GetScheduler();
- //job详情,注意MyJob
- IJobDetail myJob = JobBuilder.Create<MyJob>()
- .WithIdentity("j1")
- .Build();
- //触发器,用的简单触发器,每隔5秒执行一次
- ITrigger trigger = TriggerBuilder.Create().WithSimpleSchedule(t => t.RepeatForever().WithIntervalInSeconds(5))
- .WithIdentity("t1")
- .Build();
- //关联job和触发器
- sched.ScheduleJob(myJob, trigger);
- //执行
- sched.Start();
- Console.Read();
- //关掉
- sched.Shutdown(true);
- }
- }
- [PersistJobDataAfterExecution]//保存执行状态
- [DisallowConcurrentExecution]//不允许并发执行
- public class MyJob : IJob
- {
- public void Execute(IJobExecutionContext context)
- {
- int exeCount = context.JobDetail.JobDataMap.GetInt("exeCount");
- Console.WriteLine("我执行了,时间:{0} 第{1}次执行", DateTime.Now, exeCount);
- context.JobDetail.JobDataMap.Put("exeCount", ++exeCount);
- }
- }
下一篇: 分析 Java 任务的执行
推荐阅读
-
Spring整合Quartz定时任务并在集群、分布式系统中的应用
-
sql server代理中作业执行SSIS包失败的解决办法
-
在iOS开发的Quartz2D使用中实现图片剪切和截屏功能
-
iOS开发中Quartz2D绘图路径的使用以及条纹效果的实现
-
C#中Quartz的简单易懂定时任务实现
-
HangFire循环作业中作业因执行时间太长未完成新作业开启导致重复数据的问题
-
iOS开发中Quartz2D的基本使用方式举例
-
.NET中Quartz任务调度器的简单应用实例
-
在ASP.NET Core中创建内部使用Scoped服务的Quartz.NET宿主服务
-
SpringBoot中的定时任务与Quartz的整合