如何从lambda创建Quartz.Net Job?

时间:2017-01-18 17:14:16

标签: c# quartz.net

是否可以在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,这会使事情变得比它们更难。

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

2 个答案:

答案 0 :(得分: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 :(得分: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/