首页 > 解决方案 > 如何处理 Quartz.net 作业执行事件?

问题描述

我创建了一个通用的作业计划管理器类。我在 .net 核心应用程序中使用 Quartz.net 3.0.7。

public class ScheduleManagerManager<TJob> : IScheduleManager where TJob : IJob
{
    private readonly string _cronExpression;
    private readonly string _jobIdentity;
    private readonly string _triggerIdentity;
    private IScheduler _scheduler;
    private IJobDetail _jobDetail;
    private ITrigger _trigger;

    public ScheduleManagerManager(string cronExpression)
    {
        _cronExpression = cronExpression;
        _jobIdentity = Guid.NewGuid().ToString();
        _triggerIdentity = Guid.NewGuid().ToString();
    }

    public async Task Run()
    {
        try
        {
            _scheduler = await StdSchedulerFactory.GetDefaultScheduler();

            await _scheduler.Start();

            _jobDetail = JobBuilder.Create<TJob>()
                .WithIdentity(_jobIdentity)
                .Build();

            _trigger = TriggerBuilder.Create()
                .WithIdentity(_triggerIdentity)
                .StartNow()
                .WithCronSchedule(_cronExpression)
                .Build();

            await _scheduler.ScheduleJob(_jobDetail, _trigger);
        }
        catch (SchedulerException se)
        {
            await Console.Out.WriteLineAsync(se.Message);
        }
    }

    public void ShutDown()
    {
        _scheduler.Shutdown();
    }
}

所以我在以下应用程序中很有趣:

var manager1 = new ScheduleManagerManager<MailSender>();
var manager2 = new ScheduleManagerManager<SmsSender>();

我想添加一个事件处理程序以在执行作业后获取作业数据。

var manager1 = new ScheduleManagerManager<MailSender>();
manager1.JobExecuted += OnJobExecuted();

但是 Quartz.net 作业或触发器中没有事件。我该怎么做?

标签: c#quartz-schedulerquartz.netquartz.net-3.0

解决方案


但是 Quartz.net 作业或触发器中没有事件。当然是,它们被称为Listener

只需实施IJobListener

public class MyJobListener : IJobListener
{
    public string Name () => "MyListener";

    public Task JobToBeExecuted(IJobExecutionContext context){ }

    public Task JobExecutionVetoed(IJobExecutionContext context){ }

    public Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
    {
        // Do after Job stuff....
    }
}

并将其添加到您的调度程序中ScheduleManagerManager

var myJobListener = new MyJobListener();
_scheduler.ListenerManager.AddJobListener(myJobListener, GroupMatcher<JobKey>.AnyGroup());

推荐阅读