• 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

  • 相关阅读:
    docker 容器启动初始化,centos镜像启动并执行
    odoo 分布式session 失效解决方案
    文件分布式存储 minio docker
    odoo reports 报表打印pdf初探
    odoo 分布式快速更新
    linux Warning: Stopping docker.service, but it can still be activated by:
    linux 查看80端口的连接数
    css flex 涨姿势了
    odoo 后台打印日志修改
    iOS 导航栏消失
  • 原文地址:https://www.cnblogs.com/wudequn/p/8353329.html
Copyright © 2020-2023  润新知