zoukankan      html  css  js  c++  java
  • [C#]使用Quartz.NET来创建定时工作任务


    本文为原创文章、源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢!


    开发工具:VS2017

    语言:C#

    DotNet版本:.Net FrameWork 4.0及以上

    一、安装Quartz

    在“程序包管理器控制台”输入(下划线所示):

    PM> Install-Package Quartz

    安装完毕之后,引用的DLL如下:

    二、编写以下代码(具体见注释)

     1 using Quartz;
     2 using Quartz.Impl;
     3 using System;
     4 using System.Threading;
     5 
     6 namespace QuartzConsoleApp
     7 {
     8     class Program
     9     {
    10         static void Main(string[] args)
    11         {
    12             //创建一个标准调度器工厂
    13             ISchedulerFactory factory = new StdSchedulerFactory();
    14             //通过从标准调度器工厂获得一个调度器,用来启动任务
    15             IScheduler scheduler =  factory.GetScheduler();
    16             //调度器的线程开始执行,用以触发Trigger
    17             scheduler.Start();
    18 
    19             //使用组别、名称创建一个工作明细,此处为所需要执行的任务
    20             IJobDetail detail1 = JobBuilder.Create<MyFirstJob>().WithIdentity("MyJob1", "MyGroup").Build();
    21             //通过使用UsingJobData添加传递到context(类型:IJobExecutionContext)的属性
    22             IJobDetail detail2 = JobBuilder.Create<MySecondJob>().WithIdentity("MyJob2", "MyGroup").UsingJobData("Title","Hello World").
    23                 UsingJobData("Pi",Math.PI).UsingJobData("Cnxy","http://www.cnc6.cn").Build();
    24             IJobDetail detail3 = JobBuilder.Create<MyThridJob>().WithIdentity("MyJob3", "MyGroup").Build();
    25             //使用组别、名称创建一个触发器,其中触发器立即执行,且每隔1秒或3秒执行一个任务,重复执行
    26             ITrigger trigger1 = TriggerBuilder.Create().WithIdentity("MyTrigger1", "MyGroup").StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds(1).RepeatForever()).Build();
    27             ITrigger trigger2 = TriggerBuilder.Create().WithIdentity("MyTrigger2", "MyGroup").StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds(3).RepeatForever()).Build();
    28             ITrigger trigger3 = TriggerBuilder.Create().WithIdentity("MyTrigger3", "MyGroup").StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever()).Build();
    29             //开始执行使用指定的触发器运行执行的工作任务
    30             scheduler.ScheduleJob(detail1, trigger1);
    31             scheduler.ScheduleJob(detail2, trigger2);
    32             scheduler.ScheduleJob(detail3, trigger3);
    33         }
    34     }
    35     //运行并发运行
    36     class MyFirstJob : IJob
    37     {
    38         public void Execute(IJobExecutionContext context)
    39         {
    40             //JobDetail.Key:标识JobDetail的唯一ID
    41             //Trigger.Key:标识Trigger的唯一ID
    42             Console.WriteLine($"1,现在时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss}," +
    43                 $"工作明细:{context.JobDetail.Key.Name},工作触发器:{context.Trigger.Key.Name}");
    44         }
    45     }
    46     //运行并发运行
    47     class MySecondJob : IJob
    48     {
    49         //获得值的方式:3、属性注入
    50         public string Cnxy { set; get; }
    51         public void Execute(IJobExecutionContext context)
    52         {
    53             //获得值的方式:1、通过IJobExecutionContext.JobDetail.JobDataMap["Key"]获得所对应的值
    54             string value1 = (string)context.JobDetail.JobDataMap["Title"];
    55             //获得值的方式:2、也可以通过IJobExecutionContext.MergedJobDataMap["Key"]获得所对应的值
    56             double value2 = (double)context.MergedJobDataMap["Pi"];
    57             Console.WriteLine($"2,现在时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss}," +
    58                 $"Title:{value1},Pi:{value2},CNXY:{Cnxy}");
    59         }
    60     }
    61 
    62     //不运行并发运行
    63     [DisallowConcurrentExecution]
    64     class MyThridJob : IJob
    65     {
    66         public void Execute(IJobExecutionContext context)
    67         {
    68             Console.WriteLine($"3,现在时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss}");
    69             Thread.Sleep(3);
    70         }
    71     }
    72 
    73 }

    以上代码使用一个调度器(Scheduler)来运行一个指定的触发器(Trigger,包含运行时间间隔)并触发工作任务(JobDetail)。

    三、运行结果如下:

    四、参考链接:https://www.cnblogs.com/uptothesky/p/5633421.html

  • 相关阅读:
    [Java]获取控制台输入
    数据库行锁实验二,两个同表删除操作不存在交集而不会死锁
    数据库行锁实验一:两个删除操作处理的记录存在交集则会死锁
    Java里如何将一个字符串重复n次
    【json/regex】将嵌套对象生成的json文进行内部整形排序后再输出
    【json/regex】将简单对象生成的json文进行内部排序后再输出
    【maven】在pom.xml中引入对json-lib的依赖dependency
    (转载)使用json-lib进行Java和JSON之间的转换
    【JDBC】仅输入表名和要插入的记录数,自动检测表的字段和类型,然后插入数据的全自动程序(Oracle版)
    【Java/Csv/Regex】用正则表达式去劈分带引号的csv文件行,得到想要的行数据
  • 原文地址:https://www.cnblogs.com/cncc/p/8124681.html
Copyright © 2011-2022 走看看