您的位置:首页 > 运维架构

第一节: Timer的定时任务的复习、Quartz.Net的入门使用、Aop思想的体现

2018-03-06 08:14 525 查看
一. 前奏-Timer类实现定时任务

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

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

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

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

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



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

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


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

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


使用步骤:

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

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

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

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

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

  步骤五:开启调度


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

/// <summary>
/// Quartz框架的使用
/// </summary>
public static void Show()
{
//1.创建作业调度池(Scheduler)
IScheduler scheduler =StdSchedulerFactory.GetDefaultScheduler();

//2.创建一个具体的作业即job (具体的job需要单独在一个文件中执行)
var job = JobBuilder.Create<HelloJob>().Build();

//3.创建并配置一个触发器即trigger   1s执行一次
var trigger = TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(1)
.RepeatForever()).Build();
//4.将job和trigger加入到作业调度池中
scheduler.ScheduleJob(job, trigger);

//5.开启调度
scheduler.Start();
}


/// <summary>
/// 实现IJob接口
/// </summary>
class HelloJob : IJob
{
void IJob.Execute(IJobExecutionContext context)
{
Console.WriteLine("Hellow JOB");
}
}


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

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


  执行结果:



三. 扩展-Aop思想的体现

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

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

/// <summary>
/// Quartz中的AOP思想
/// </summary>
public static void AopShow()
{
//1.创建Schedule
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

//2.创建job (具体的job需要单独在一个文件中执行)
var job = JobBuilder.Create<HelloJob>().Build();

//3.配置trigger   1s执行一次
var trigger = TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(1)
.RepeatForever()).Build();
//AOP配置
scheduler.ListenerManager.AddJobListener(new MyAopListener(), GroupMatcher<JobKey>.AnyGroup());

//4.将job和trigger加入到作业调度池中
scheduler.ScheduleJob(job, trigger);

//5. 开始调度
scheduler.Start();
}
/// <summary>
/// Aop类
/// </summary>
public class MyAopListener : IJobListener
{
public string Name
{
get
{
return "hello world";
}
}
public void JobExecutionVetoed(IJobExecutionContext context)
{

}
public void JobToBeExecuted(IJobExecutionContext context)
{
Console.WriteLine("执行前写入日志");
}
public void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
{
Console.WriteLine("执行后写入日志");
}
}


  执行结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: