ASP.NET Core

asp.net core + Quartz.Net

2019-05-07  本文已影响0人  GongZH丶

Quartz.Net文档地址:https://www.quartz-scheduler.net/documentation/index.html

参考:http://www.cnblogs.com/mi12205599/p/10361763.html

Quartz.Net 任务监听:https://www.jianshu.com/p/ef1b6d1e11b2

本文源码地址:https://gitee.com/forestGzh/Gzh.Template.Core

实现效果:

image.png

在Startup中配置:(具体实现看源码)

在控制器中创建作业调度:(具体实现看源码)

namespace Gzh.Template.Core.WebApi.Controllers

{

    [Route("api/[controller]")]

    public class TestQuartzController : Controller

    {

        private readonly ISchedulerFactory _schedulerFactory;

        private IScheduler _scheduler;

        public TestQuartzController(ISchedulerFactory schedulerFactory)

        {

            _schedulerFactory = schedulerFactory;

            _helloJobService = helloJobService;

        }

        /// <summary>

        /// Tests the quartz.

        /// </summary>

        /// <returns>The quartz.</returns>

        [HttpGet("testQuartz")]

        public async Task<ActionResult> TestQuartz()

        {

            //1、通过调度工厂获得调度器

            _scheduler = await _schedulerFactory.GetScheduler();

            //2、开启调度器

            await _scheduler.Start();

            //3、创建一个触发器

            var trigger = TriggerBuilder.Create()

              .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次

              .Build();

            //4、创建任务

            var jobDetail = JobBuilder.Create<HelloJobTest>()

              .WithIdentity("job", "group")

              .Build();

            //5、将触发器和任务器绑定到调度器中

            await _scheduler.ScheduleJob(jobDetail, trigger);

            return Ok();

        }

    }

}

添加、启动、删除作业调度:

作业调度实体类:(具体实现看源码)

using System;

using System.ComponentModel.DataAnnotations.Schema;

using Gzh.Template.Core.Repository.Core;

namespace Gzh.Template.Core.Repository.Domain.MysqlEntity

{

    public class ScheduleEntity : EntityMysql

    {

        /// <summary>

        /// Job的Key,在组内唯一

        /// </summary>

        /// <value>The job key.</value>

        [Column("job_key")]

        public string JobKey { get; set; }

        /// <summary>

        /// Job的组名

        /// </summary>

        /// <value>The job group.</value>

        [Column("job_group")]

        public string JobGroup { get; set; }

        /// <summary>

        /// trigger的Key,在组内唯一

        /// </summary>

        /// <value>The trigger key.</value>

        [Column("trigger_key")]

        public string TriggerKey { get; set; }

        /// <summary>

        /// trigger的组名

        /// </summary>

        /// <value>The trigger group.</value>

        [Column("trigger_group")]

        public string TriggerGroup { get; set; }

        /// <summary>

        /// 创建时间

        /// </summary>

        /// <value>The time create.</value>

        [Column("time_create")]

        public DateTime TimeCreate { get; set; }

        /// <summary>

        /// 开始执行时间

        /// </summary>

        /// <value>The time start.</value>

        [Column("time_start")]

        public DateTime TimeStart { get; set; }

        /// <summary>

        /// 结束时间

        /// </summary>

        /// <value>The time end.</value>

        [Column("time_end")]

        public DateTime TimeEnd { get; set; }

        /// <summary>

        /// 重复执行次数

        /// </summary>

        /// <value>The repet count.</value>

        [Column("repeat_count")]

        public int RepeatCount { get; set; }

        /// <summary>

        /// 运行状态

        /// </summary>

        /// <value>The state of the run.</value>

        [Column("run_state")]

        public string RunState { get; set; }

        /// <summary>

        /// 任务描述

        /// </summary>

        /// <value>The job description.</value>

        [Column("job_description")]

        public string JobDescription { get; set; }

    }

}

对HelloJob这个作业的调度:(具体实现看源码)

using System;

using System.Threading.Tasks;

using Gzh.Template.Core.Repository.Domain.MysqlEntity;

namespace Gzh.Template.Core.Application.IService

{

    public interface IHelloJobService

    {

        /// <summary>

        /// 添加一个job

        /// </summary>

        /// <returns>The schedule job.</returns>

        /// <param name="scheduleEntity">Schedule entity.</param>

        Task<ScheduleEntity> AddScheduleJob(ScheduleEntity scheduleEntity);

        /// <summary>

        /// 运行一个job

        /// </summary>

        /// <returns><c>true</c>, if schedule job was run, <c>false</c> otherwise.</returns>

        /// <param name="scheduleEntity">Schedule entity.</param>

        Task<bool> RunScheduleJobAsync(ScheduleEntity scheduleEntity);

        /// <summary>

        /// 停止并删除一个job

        /// </summary>

        /// <returns><c>true</c>, if schedule job was stoped, <c>false</c> otherwise.</returns>

        /// <param name="scheduleEntity">Schedule entity.</param>

        Task<bool> RemoveScheduleJobAsync(ScheduleEntity scheduleEntity);

        /// <summary>

        /// 暂停一个job

        /// </summary>

        /// <returns><c>true</c>, if schedule was paused, <c>false</c> otherwise.</returns>

        /// <param name="scheduleEntity">Schedule entity.</param>

        Task<bool> PauseScheduleJobAsync(ScheduleEntity scheduleEntity);

    }

}

HelloJob(实现job,trigger和scheduler的Listener):

https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/trigger-and-job-listeners.html

https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/scheduler-listeners.html

using System;

using System.Threading;

using System.Threading.Tasks;

using Microsoft.Extensions.Logging;

using Quartz;

namespace Gzh.Template.Core.Application.Jobs

{

    /// <summary>

    /// quartz的作业类,在QuartzStartup中添加到调度程序中

    /// </summary>

    public class HelloJob : IJob, IJobListener, ITriggerListener, ISchedulerListener

    {

        private readonly ILogger _logger;

        public string Name { get; }

        public HelloJob(ILoggerFactory loggerFactory)

        {

            Name = this.GetType().ToString();

            _logger = loggerFactory.CreateLogger<QuartzStartup>();

        }

        //实现IJob接口的Excute方法

        public async Task Execute(IJobExecutionContext context)

        {

            //context.

            _logger.LogInformation("job名称:" + context.JobDetail.Key

                + "\n trigger开始时间:" + context.Trigger.StartTimeUtc

                + "\n trigger结束时间:" + context.Trigger.EndTimeUtc

                + "\n 当前时间:" + DateTime.Now

                + "\n 当前触发时间:" + context.ScheduledFireTimeUtc

                + "\n 下次触发时间:" + context.NextFireTimeUtc

                + "\n 传递的数据:" + context.JobDetail.JobDataMap["name"]

                );

            //await Console.Out.WriteLineAsync("Hello Job" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

        }

        #region

        public async Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken)

        {

            _logger.LogInformation("任务执行失败,重新执行");

            //任务执行失败,再次执行任务

            await Execute(context);

        }

        public async Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken)

        {

            _logger.LogInformation("准备执行任务");

            //return null;

        }

        public async Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken)

        {

            _logger.LogInformation("任务执行完成");

        }

        #endregion

        #region

        public async Task TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode, CancellationToken cancellationToken)

        {

            _logger.LogInformation("触发器触发成功 \n ------------------------------------------------------------------------------------------------------------------");

        }

        public async Task TriggerFired(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken)

        {

            _logger.LogInformation("触发器开始触发");

        }

        public async Task TriggerMisfired(ITrigger trigger, CancellationToken cancellationToken)

        {

            _logger.LogInformation("触发器触发失败");

        }

        public async Task<bool> VetoJobExecution(ITrigger trigger, IJobExecutionContext context, CancellationToken cancellationToken)

        {

            _logger.LogInformation("可以阻止任务执行");

            //true 阻止,false 不阻止

            return false;

        }

        #endregion

        #region

        public async Task JobScheduled(ITrigger trigger, CancellationToken cancellationToken)

        {

            _logger.LogInformation("JobScheduled");

        }

        public async Task JobUnscheduled(TriggerKey triggerKey, CancellationToken cancellationToken)

        {

            _logger.LogInformation("JobUnscheduled");

        }

        public async Task TriggerFinalized(ITrigger trigger, CancellationToken cancellationToken)

        {

            _logger.LogInformation("TriggerFinalized");

        }

        public async Task TriggerPaused(TriggerKey triggerKey, CancellationToken cancellationToken)

        {

            _logger.LogInformation("TriggerPaused");

        }

        public async Task TriggersPaused(string triggerGroup, CancellationToken cancellationToken)

        {

            _logger.LogInformation("TriggersPaused");

        }

        public async Task TriggerResumed(TriggerKey triggerKey, CancellationToken cancellationToken)

        {

            _logger.LogInformation("TriggerResumed");

        }

        public async Task TriggersResumed(string triggerGroup, CancellationToken cancellationToken)

        {

            _logger.LogInformation("TriggersResumed");

        }

        public async Task JobAdded(IJobDetail jobDetail, CancellationToken cancellationToken)

        {

            _logger.LogInformation("JobAdded");

        }

        public async Task JobDeleted(JobKey jobKey, CancellationToken cancellationToken)

        {

            _logger.LogInformation("JobDeleted");

        }

        public async Task JobPaused(JobKey jobKey, CancellationToken cancellationToken)

        {

            _logger.LogInformation("JobPaused");

        }

        public async Task JobInterrupted(JobKey jobKey, CancellationToken cancellationToken)

        {

            _logger.LogInformation("JobInterrupted");

        }

        public async Task JobsPaused(string jobGroup, CancellationToken cancellationToken)

        {

            _logger.LogInformation("JobsPaused");

        }

        public async Task JobResumed(JobKey jobKey, CancellationToken cancellationToken)

        {

            _logger.LogInformation("JobResumed");

        }

        public async Task JobsResumed(string jobGroup, CancellationToken cancellationToken)

        {

            _logger.LogInformation("JobsResumed");

        }

        public async Task SchedulerError(string msg, SchedulerException cause, CancellationToken cancellationToken)

        {

            _logger.LogInformation("SchedulerError");

        }

        public async Task SchedulerInStandbyMode(CancellationToken cancellationToken)

        {

            _logger.LogInformation("SchedulerInStandbyMode");

        }

        public async Task SchedulerStarted(CancellationToken cancellationToken)

        {

            _logger.LogInformation("SchedulerStarted");

        }

        public async Task SchedulerStarting(CancellationToken cancellationToken)

        {

            _logger.LogInformation("SchedulerStarting");

        }

        public async Task SchedulerShutdown(CancellationToken cancellationToken)

        {

            _logger.LogInformation("SchedulerShutdown");

        }

        public async Task SchedulerShuttingdown(CancellationToken cancellationToken)

        {

            _logger.LogInformation("SchedulerShuttingdown");

        }

        public async Task SchedulingDataCleared(CancellationToken cancellationToken)

        {

            _logger.LogInformation("SchedulingDataCleared");

        }

        #endregion

    }

}
上一篇 下一篇

猜你喜欢

热点阅读