【问题标题】:How to create Quartz.Net Job from lambda?如何从 lambda 创建 Quartz.Net 作业?
【发布时间】:2017-01-18 17:14:15
【问题描述】:

是否可以在 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,这使事情变得比应有的困难。

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

【问题讨论】:

  • 顺便说一句,() => Foo(),相当于只写Foo。括号取消
  • @Natan Quartz.Net中没有这个东西,需要自己写。也许JobFactory 可以帮助您实现这一目标。

标签: c# quartz.net


【解决方案1】:

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

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();
            }
        }
    }
}

【讨论】:

  • 嗨,我对这段代码有疑问。 prntscr.com/e8wbhn ;我试图每天同时调用一次 ForceScheduledCheck() 。但是作业没有在需要的时间运行。有什么想法吗?
【解决方案2】:

编写了一个小扩展库,允许使用 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/

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多