【问题标题】:Schedule an Action in Quartz.net在 Quartz.net 中安排一个动作
【发布时间】:2015-05-06 22:40:54
【问题描述】:

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

我有一个接收动作和日期时间的方法,我只需要安排动作 X 在时间 Y 运行。

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

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

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

【问题讨论】:

    标签: c# .net quartz.net


    【解决方案1】:

    我认为 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();
    

    【讨论】:

      【解决方案2】:

      我不知道 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.Net 确实很强大,但我觉得它对于像“即发即弃”这样的简单任务来说过于复杂了。我最近切换到HangFire 处理这类事情。干杯。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多