Quartz.Net—初识

什么是Quartz.Net

计划任务,定时框架。大到可以做灾难转移  负载均衡。小到可以做定时生成数据,数据更新等等。

官网  http://www.quartz-scheduler.org/    Quartz.Net是Quartz    JAVA版本的移植版本,所以http://www.quartz-scheduler.org/介绍的也是java版本的,  .net的官网是https://www.quartz-scheduler.net/

本文使用quartz版本3.0.2(VS2017打开   C#7.1)

 quartz的官方项目还是很完整的。学习起来很方便。

计划任务包含的元素

Scheduler-调度器

任务的管理、协调者。

像一个工厂中流水线的管理员,管理各个流水线的工作。

JOB-作业

就是要执行什么动作。

像工厂中每个流水线具体执行的什么工作。

TRIGGER-触发器

就是什么时候什么条件执行。

像工厂中每个流水线的工作时间表。

创建一个简单任务
private async void button1_Click(object sender, EventArgs e)
{
    ISchedulerFactory sf = new StdSchedulerFactory();
    //开启10+1个线程    只不过都是等待状态
    IScheduler sched =await sf.GetScheduler();



    Console.WriteLine("任务开始");
    //会激活调度线程   从jobstore中读取快要执行的trigger,然后获取相关联的job进行执行
    await sched.Start();



    IJobDetail job = JobBuilder.Create<MyJob1>().WithDescription("工作任务描述1").WithIdentity("job1", "group1").Build();

    //DateTimeOffset时间偏移,一般UTC是世界统一时间,世界各地时区不同(TimeZoneInfo),世界就不一样,所以每一个地方都有自己的时间偏移量
    DateTimeOffset runtime = DateBuilder.EvenSecondDateAfterNow();
    ITrigger trigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").WithSimpleSchedule(t=>t.WithIntervalInSeconds(1).RepeatForever()).Build();

    //开始调度任务
    await sched.ScheduleJob(job, trigger);


    
    
    await Task.Delay(TimeSpan.FromSeconds(60));
    Console.WriteLine("任务结束");
    await sched.Shutdown(true);
}

 

Quartz中的几个构件

1、Scheduler    调度器   (一个大的容器)

2、Job

3、Trigger

一个job可以有多个trigger

4、Simplethreadpool    (10+1的关系)

最终的执行都是委托给线程池执行的。 默认   10个线程池叫做workthread,  一个是调度线程叫做 quartzschedulerthread(作用获取到当前快要执行的线程)。他们都集成quartzthread

他是quartz默认的线程池,在thread上面封装的

5、JobStore

分为dbstore 和 ramstore

 

 

 

 

 

多线程介绍 http://www.cnblogs.com/wudequn/p/7571039.html

用到设计模式

抽象工厂

ISchedulerFactory

StdSchedulerFactory : ISchedulerFactory

DirectSchedulerFactory : ISchedulerFactory

建造者

链式建造

TriggerBuilder

JobBuilder

DateBuilder

(构建过程是稳定的

国建过程都是返回当前类的引用。方便链式构造

可插拔式,IOC模式

先读取配置文件中配置的,要是没有就默认一个。这样组件就可以被替换。

AOP

public class MyJobListener1 : IJobListener
{
    public string Name
    {
        get
        {
            return "L1";
        }
    }

    public Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken = default(CancellationToken))
    {
        return Task.Factory.StartNew(() =>
        {
            Console.WriteLine("JobExecutionVetoed");
        });
    }

    public Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken = default(CancellationToken))
    {
        return Task.Factory.StartNew(() =>
        {//执行前
            Console.WriteLine("JobToBeExecuted");
        });
        //throw new NotImplementedException();
    }

    public Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken = default(CancellationToken))
    {
        return Task.Factory.StartNew(() =>
        {
            //执行后
            Console.WriteLine("JobWasExecuted");
        });
    }
}
View Code

sched.ListenerManager.AddJobListener(new MyJobListener1(), GroupMatcher<JobKey>.AnyGroup());

Quartz.Net优点

数据库持久化

支持集群

可视化管理界面web

事件灵活控制cron

posted @ 2018-03-01 01:48  西伯利亚的狼  阅读(497)  评论(0编辑  收藏