.NET Quartz Timed Operating System

参照アドレス

クォーツ紹介

Quartzは、ジョブ、トリガー、スケジューラーの3つの部分で構成されています

  • 定期的に実行する必要のあるジョブ
    2.トリガー
  • トリガーするときは、cron式を使用することをお勧めします。オンラインでcron式を生成します:http : //cron.qqe2.com/
    3.スケジューラー
  • ジョブとトリガーをスケジューラーにロードして実行する

1.NugetはQuartzをインストールします

2.宿題の使用

ジョブを作成するには3つの方法があり
ます。1.ジョブクラスを作成し、IJobインターフェイスを実装します。

ジョブクラスを作成する

 public class HelloJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Console.Out.WriteLineAsync("Greetings from HelloJob!");
        }
    }

見積もり

//引用作业类
  IJobDetail job = JobBuilder.Create<HelloJob>()
                    .WithIdentity("job1", "group1") //分组,暂时不知道有什么用
                    .Build();

2.時限ジョブを動的に追加する既存のメソッドに適した参照クラス。//すべてijobインターフェースを実装する必要があります

            Type type = Type.GetType("test1.TestCase");//获取类 ""里为 命名空间.类名
            Object obj = Activator.CreateInstance(type);//这里创建
            //4.创建一个作业
            IJobDetail job2 = JobBuilder.Create(obj.GetType())
                .WithIdentity("demojob1", "groupa")
                .Build();

3.物理DLLを参照します。//すべてijobインターフェースを実装する必要があります

//适合在不改变代码的情况下,动态添加要定时执行的方法(前面是文件物理地址(可以使用映射将虚拟地址转换成物理地址) ,后面是命名空间加类名)
            object obj = Assembly.LoadFile(@"D:\普通文件袋\测试\ClassLibrary2\bin\Debug\ClassLibrary2.dll").CreateInstance("ClassLibrary2.Class2");
            //4.创建一个作业
            IJobDetail job2 = JobBuilder.Create(obj.GetType())
                .WithIdentity("demojob1", "groupa")
                .Build();

3.トリガーの使用

1.指定された時間にトリガーして、
オンラインでcron式生成します:http : //cron.qqe2.com/

        /// <summary>
        /// 周一到周五,每天早晨8点30
        /// </summary>
        /// <returns></returns>
        public static ITrigger DayMorningRun()
        {
           
            string corn = "0 30 8 0 0 1/5 *";
            ITrigger trigger = TriggerBuilder.Create()
               .WithIdentity("trigger_DayMorningRun", "group_DayMorningRun")
              .WithCronSchedule(corn)
              .Build();
            return trigger;
        }

2.トリガーは複数のジョブを転送できます

  string corn = "3/5 * * * * ? *";
                ITrigger trigger = TriggerBuilder.Create()
                   .WithIdentity("demotrigger1", "groupa")
                  .WithCronSchedule(corn)//从第三秒开始,每5秒执行一次
                  .ForJob(job) //触发器绑定多个作业
                  .ForJob(job) //触发器绑定多个作业
                  .Build();

4.スケジューラの使用

公式の例
https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html

private static async Task RunProgramRunExample()
        {
            try
            {

                //1.首先创建一个作业调度池
                ISchedulerFactory schedf = new StdSchedulerFactory();
                //2.实例化调度器工厂
                ISchedulerFactory schedulefactory = new StdSchedulerFactory();
                //3.实例化调度器
                IScheduler scheduler = await schedulefactory.GetScheduler();


                // 开始执行调度
                await scheduler.Start();

                //将作业以及触发器放入调度器
                await scheduler.ScheduleJob(job, trigger);
                //也可以放入触发器
                //await scheduler.ScheduleJob(trigger);

                // some sleep to show what's happening
                //await Task.Delay(TimeSpan.FromSeconds(10)); //程序10秒后执行下一步
                //await scheduler.Shutdown(); //结束调度
            }
            catch (SchedulerException se)
            {
                Console.WriteLine(se);
            }
        }

5.完全な例

    class Program
    {
       
        private static void Main(string[] args)
        {
             RunProgramRunExample().GetAwaiter().GetResult();

            Console.WriteLine("Press any key to close the application");
            Console.ReadKey();
        }

        private static async Task RunProgramRunExample()
        {
            try
            {

                //1.首先创建一个作业调度池
                ISchedulerFactory schedf = new StdSchedulerFactory();
                //2.实例化调度器工厂
                ISchedulerFactory schedulefactory = new StdSchedulerFactory();
                //3.实例化调度器
                IScheduler scheduler = await schedulefactory.GetScheduler();
              
                await scheduler.Start();

                IJobDetail job = JobBuilder.Create<HelloJob>()
                    .WithIdentity("job1", "group1")
                    .Build();

                //5.2推荐:第二种使用cron表达式
                //在线生成cron表达式: http://cron.qqe2.com/ 
                string corn = "3/5 * * * * ? *";
                ITrigger trigger = TriggerBuilder.Create()
                   .WithIdentity("demotrigger1", "groupa")
                  .WithCronSchedule(corn)//从第三秒开始,每5秒执行一次
                  .ForJob(job)
                  .ForJob(job)
                  .Build();

          
                await scheduler.ScheduleJob(job, trigger);
            }
            catch (SchedulerException se)
            {
                Console.WriteLine(se);
            }
        }
    }

    public class HelloJob : IJob
    {
        

        public async Task Execute(IJobExecutionContext context)
        {
           
            await Console.Out.WriteLineAsync("Greetings from HelloJob!");
        }
    }


6. MVC拡張

MVCは、CronJobsスケジュール済みジョブ、CronTriggersトリガー、CronSchedulersスケジューラー
// todoの3つのカテゴリーで構成されます。スケジュールされたジョブにトリガーを直接配置できます。次に、後で最適化し
ます最後に、Global.asaxのApplication_Startに登録する必要があります

CronJobs

public class CronJobs
    {
        public class Job : IJob
        {
           public async Task Execute(IJobExecutionContext context)
            {
                Task task1 = Task.Run(() =>
                {
                   //执行定时作业
                });
                //或者这边也行
            }
        }
    }

Trigger、CronTriggers

 public class CronTriggers
    {
            //在线生成cron表达式: http://cron.qqe2.com/ 
            /// <summary>
            /// 周一到周五,每天早晨8点30
            /// </summary>
            /// <returns></returns>
            public static ITrigger DayMorningRun()
                    {
                    
                        string corn = "0 30 8 0 0 1/5 *";
                        ITrigger trigger = TriggerBuilder.Create()
                        .WithIdentity("trigger_DayMorningRun", "group_DayMorningRun")
                        .WithCronSchedule(corn)
                        .Build();
                        return trigger;
                    }
        }

スケジューラcronSchedulers

 public class CronSchedulers
    {
        public static void Start()
        {
            Task task = Task.Run(async () => {
                await StartAsync();
            });

        }

        public static async Task StartAsync()
        {
            try
            {
                //1.首先创建一个作业调度池
                ISchedulerFactory schedf = new StdSchedulerFactory();
                //2.实例化调度器工厂
                ISchedulerFactory schedulefactory = new StdSchedulerFactory();
                //3.实例化调度器
                IScheduler scheduler = await schedulefactory.GetScheduler();
               
                await scheduler.Start();
                IJobDetail job1 = JobBuilder.Create<CronJobs.DayMorningRunJobs>()
                  .Build();
                ITrigger trigger1 = CronTriggers.DayMorningRun();
              
                //单个触发器只能触发单个作业,单个作业可以多个触发器触发
                await scheduler.ScheduleJob(job1, trigger1);
            }
            catch (SchedulerException se)
            {
                 LogHelper.WriteLog("调度报错", se);//log4Net日志
            }
        }

    }

Global.asaxのApplication_Startに登録する

//定时调度
            CronSchedulers.Start();

おすすめ

転載: www.cnblogs.com/Alex-Mercer/p/12712330.html