博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转载】第1节: 使用Timer编写定时任务、Quartz.Net入门、Aop思想的体现
阅读量:5321 次
发布时间:2019-06-14

本文共 3836 字,大约阅读时间需要 12 分钟。

 

 

 

一. 前奏-Timer类实现定时任务

   在没有引入第三方开源的定时调度框架之前,我们处理一些简单的定时任务同时都是使用Timer类, DotNet中的Timer类有三个,分别位于不同的命名空间下,分别是:

    ①.位于System.Windows.Forms里,即定时器控件,不过多介绍了

    ②.位于System.Threading.Timer类里 (重点介绍)

    ③.位于System.Timers.Timer类里 (不介绍)

  下面重点介绍第二种,位于Threading下面的Timer类,观察其源码,发现有多种构造函数,我们重点介绍其中的一种。

 

  分享一段代码:2秒后开启该线程,然后每隔4s调用一次。

1           //2秒后开启该线程,然后每隔4s调用一次2             System.Threading.Timer timer = new System.Threading.Timer((n) =>3             {4                 //书写业务逻辑5                 Console.WriteLine("我是定时器中的业务逻辑哦{0}",n);6             }, "1", 2000, 4000);

   分析总结:上面的代码显而易见,只能控制:延迟多久开始执行,每隔多久执行一次,至于执行多少次、什么时间关闭均无法实现,更不用说处理一些复杂的时间间隔了,所以Timer类仅仅适合处理对时间要求非常简单的定时任务。

 

二. 进入主题-Quartz.Net的入门使用

使用步骤:

  前提:通过NuGet引入程序集或者直接下载源码进行引入,然后分五步走。

  步骤一:创建作业调度池(Scheduler)

  步骤二:创建一个具体的作业即job (具体的job需要单独在一个文件中执行)

  步骤三:创建并配置一个触发器即trigger

  步骤四:将job和trigger加入到作业调度池中

  步骤五:开启调度

 下面分享一段简单的代码(立即执行、每隔一秒执行一次、永久执行)

1        ///  2         /// Quartz框架的使用 3         ///  4         public static void Show() 5         { 6             //1.创建作业调度池(Scheduler) 7             IScheduler scheduler =StdSchedulerFactory.GetDefaultScheduler(); 8             9             //2.创建一个具体的作业即job (具体的job需要单独在一个文件中执行)10             var job = JobBuilder.Create
().Build();11 12 //3.创建并配置一个触发器即trigger 1s执行一次13 var trigger = TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(1)14 .RepeatForever()).Build();15 //4.将job和trigger加入到作业调度池中16 scheduler.ScheduleJob(job, trigger);17 18 //5.开启调度19 scheduler.Start();20 }
1     ///  2     /// 实现IJob接口 3     ///  4     public class HelloJob : IJob 5     { 6         public void Execute(IJobExecutionContext context) 7         { 8             Console.WriteLine("Hellow JOB"); 9         }10     }

  分析:每个Job都需要实现IJob接口,并且显式的实现Execute方法;创建调度器除了上述方法外,还可以:

1   //另外一种创建调度池的方法2   var factory = new StdSchedulerFactory();3   IScheduler scheduler2 = factory.GetScheduler();

  执行结果:

 

三. 扩展-Aop思想的体现

   我们想在每次Job执行的前后,分别执行一段通用的业务,但有不想和原业务写在一起,这个时候就需要面向切面编程了,即AOP思想的体现。

   Quartz.Net中Aop思想通过JobListener来实现,代码如下:

1         ///  2         /// Quartz中的AOP思想 3         ///  4         public static void AopShow() 5         { 6             //1.创建Schedule 7             IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); 8              9             //2.创建job (具体的job需要单独在一个文件中执行)10             var job = JobBuilder.Create
().Build();11 12 //3.配置trigger 1s执行一次13 var trigger = TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(1)14 .RepeatForever()).Build();15 //AOP配置16 scheduler.ListenerManager.AddJobListener(new MyAopListener(), GroupMatcher
.AnyGroup());17 18 //4.将job和trigger加入到作业调度池中19 scheduler.ScheduleJob(job, trigger);20 21 //5. 开始调度22 scheduler.Start();23 }24 ///
25 /// Aop类26 /// 27 public class MyAopListener : IJobListener28 {29 public string Name30 {31 get32 {33 return "hello world";34 }35 }36 public void JobExecutionVetoed(IJobExecutionContext context)37 {38 39 }40 public void JobToBeExecuted(IJobExecutionContext context)41 {42 Console.WriteLine("执行前写入日志");43 }44 public void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)45 {46 Console.WriteLine("执行后写入日志");47 }48 }

  执行结果:

 

 

 

 

转载于:https://www.cnblogs.com/lichunting/articles/9237034.html

你可能感兴趣的文章
Basic Cisco Configs
查看>>
Yii 多表关联relations
查看>>
python 冒泡、二分查找
查看>>
Hello World
查看>>
linux 下安装python3
查看>>
js中style,currentStyle和getComputedStyle的区别
查看>>
技巧类
查看>>
LOJ6036编码
查看>>
day11_多线程(多线程安全问题)
查看>>
Diary of Codeforces Round #402 (Div. 2)
查看>>
产品体验成就产品
查看>>
DOM 表单应用
查看>>
C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字
查看>>
为什么eclipse中启动tomcat后,浏览器中出现404?
查看>>
js压缩
查看>>
JS实现手机访问pc网址自动跳转到wap网站
查看>>
How to create movie with pictures
查看>>
HTML 5 拖放(Drag 和drop)
查看>>
shell_exec() has been disabled for security reasons错误怎么解决?
查看>>
【福音】开发者可接入微信公众平台设备功能了
查看>>