在 Quartz.net 安排一个动作

Schedule an Action in Quartz.net

我正在尝试了解 Quartz.NET 的来龙去脉,但在完成我认为非常简单的任务方面并没有取得太大进展。

我有一个接收 Action 和 DateTime 的方法,我只需要在时间 Y 将操作 X 安排到 运行。

这看起来很简单,但是 JobBuilder.Create() 需要一个实现 IJob 的类型参数...但是在我得到它之前,我一点也不知道我收到的 Action 做了什么。我无法使用定义明确的 Execute(IJobExecutionContext context) 方法 class,因为我在编译时没有该信息。

我也无法更改方法的签名。我得到一个 Action 和一个 DateTime,这不是我的决定。

Quartz真的不能处理这个看似简单的任务吗?

我不知道 Quartz.Net 是否是实现您正在寻找的目标的正确工具。
用它来做会很复杂。

我建议您切换到另一个工具,例如 FluentScheduler:

Install-Package FluentScheduler

然后你可以这样做:

class Program
{
    static void Main(string[] args)
    {
        ScheduleAction(DateTime.UtcNow.AddSeconds(4), Action1, "A", "B");
        ScheduleAction(DateTime.UtcNow.AddSeconds(8), Action1, "C", "D");
        ScheduleAction(DateTime.UtcNow.AddSeconds(12), Action1, "E", "F");

        Console.WriteLine("Running ...");
        Console.ReadLine();
    }

    private static void ScheduleAction(DateTime runOnceAt, Action<string, string> action, string param1, string param2)
    {
        FluentScheduler.TaskManager.AddTask(() =>
        {
            action.Invoke(param1, param2);

        }, x => x.WithName("MyTask").ToRunOnceAt(runOnceAt));
    }

    private static void Action1(string param1, string param2)
    {
        Console.WriteLine("Running Action 1 {0} - {1}", param1, param2);
    }

    private static void Action2(string param1, string param2)
    {
        Console.WriteLine("Running Action 2 {0} - {1}", param1, param2);
    }

    private static void Action3(string param1, string param2)
    {
        Console.WriteLine("Running Action 3 {0} - {1}", param1, param2);
    }
}

我不认为 Quartz 内置了这种特殊的能力,但是在 Quartz 现有的 API 之上实现它是微不足道的:

class RunActionJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        var action = context.MergedJobDataMap["action"] as Action;
        action();
    }
}

public static JobBuilder ActionJob(Action action)
{
    return JobBuilder
        .Create<RunActionJob>()
        .SetJobData(new JobDataMap
        {
            {"action", action}
        });
}

// Usage:

var job = ActionJob(() => Console.WriteLine("task 1..."))
    .WithIdentity("task1", "group1")
    .Build();