如何从lambda创建Quartz.Net Job?

问题描述 投票:3回答:2

是否可以在Quartz.net中使用lambda创建作业?

我有很多需要运行的任务,我真的很想避免为每个工作创建几十个类。我不需要任何高级设置,我只需要偶尔调用一个方法。

scheduler.ScheduleJob(() => DoSomething(a), TimeSpan.FromSeconds(10));
scheduler.ScheduleJob(() => DoAnotherThing(b), TimeSpan.FromSeconds(20));
scheduler.ScheduleJob(() => DoThis(c), TimeSpan.FromHours(2));
scheduler.ScheduleJob(() => DoThat(d), TimeSpan.FromMinutes(30));
...

我会为此创建一个扩展方法,但似乎每个作业都需要它自己的类型才能创建一个IJob,这使得事情比它们应该更难。

有关如何实现这一目标的任何想法?

c# quartz.net
2个回答
3
投票

好的,我缺少参数的jobdata。如果有人需要,我可以使用以下代码完成此操作:

using Quartz;
using System;

namespace MyApp
{
    public static class SchedulerExtensions
    {
        public static DateTimeOffset ScheduleJob(this IScheduler scheduler, Action action, TimeSpan initialDelay, TimeSpan interval)
        {
            var data = new JobDataMap();
            data.Add("_", action);

            var jobDetail = JobBuilder.Create<GenericJob>().UsingJobData(data).Build();

            var trigger = TriggerBuilder.Create()
                .StartAt(DateTimeOffset.UtcNow.Add(initialDelay))
                .WithSimpleSchedule(s => s.WithInterval(interval).RepeatForever())
                .Build();

            return scheduler.ScheduleJob(jobDetail, trigger);
        }

        class GenericJob : IJob
        {
            public void Execute(IJobExecutionContext context)
            {
                (context.JobDetail.JobDataMap["_"] as Action)?.Invoke();
            }
        }
    }
}

1
投票

写了一个允许起诉lambda语法的小扩展库。

scheduler.ScheduleJob(() => Console.WriteLine("With TriggerBuilder"), 
 builder => builder.StartNow()
 .WithSimpleSchedule(x => x
    .WithIntervalInSeconds(10)
    .RepeatForever()));

scheduler.ScheduleJob(() => Console.WriteLine("With int delay and interval"), 0, 10);

Nuget:https://www.nuget.org/packages/Quartz.Lambda/

Github:https://github.com/midianok/Quartz.Lambda/

© www.soinside.com 2019 - 2024. All rights reserved.