【问题标题】:Refactoring job definition (a generic function) in Quartz.Net在 Quartz.Net 中重构作业定义(通用函数)
【发布时间】:2014-11-27 17:23:29
【问题描述】:

我正在试用 Quartz.net,我将有许多非常相似的任务,并且希望我不必输入全部内容

IJobDetail job = JobBuilder.Create<HelloJob>()
                    .WithIdentity("job1", "group1")
                    .Build();

每次都说鬼话。所以我想我会尝试让我的工作都继承自一个强制他们拥有某些数据的基础工作,例如

abstract public class BaseJob : IJob
{
    public static abstract string Name { get; }

    public void Execute(IJobExecutionContext context)
    {
        //Calls an abstract method that does the actual work with some wrapping stuff around it
    }
}

现在假设我实现了从 BaseJob 继承的 Job1Job2 类,我可以这样做:

List<IJobDetail> Jobs = new List<IJobDetail>();

Jobs.Add(JobBuilder.Create<Job1>()
                   .WithIdentity(Job1.Name, "group1")
                   .Build());

Jobs.Add(JobBuilder.Create<Job2>()
                   .WithIdentity(Job2.Name, "group1")
                   .Build());

但我想重构它,这样我就可以创建一个 List&lt;BaseJob&gt; JobList,然后在某个地方填充它,然后在 foreach 循环中填充 Jobs。这可能吗,因为JobBuilder.Create&lt;&gt;() 是一种通用方法?如果这是正确的术语(即&lt;&gt; 中的位),我如何使用变量指定类型?

我尝试使用typeof 无济于事,例如(注意这只是在一个元素上,但如果迭代则基本相同)

Jobs.Add(JobBuilder.Create<typeof(JobList[0])>()
                   .WithIdentity(JobList[0].Name, "group1")
                   .Build()))

我什至尝试将JobList 设为List&lt;Type&gt; 然后

Jobs.Add(JobBuilder.Create<JobList[0]>()
                   .WithIdentity(JobList[0].Name, "group1")
                   .Build()))

但这也不好。有没有办法做到这一点?反射可以在这里提供帮助吗?

【问题讨论】:

    标签: c# generics reflection refactoring quartz.net


    【解决方案1】:

    有一个版本的 JobBuilder.Create 将类型作为参数并且不是通用的。所以你可以打电话:

    foreach (var jobType in jobTypeList)
    {
        JobBuilder.Create(jobType).WithIdentity()...
    }
    

    【讨论】:

      【解决方案2】:

      所以基本上,您的问题与quartz.net 关系不大,而与参数泛型调用有关。本帖可以帮到你:http://www.codeproject.com/Articles/22615/Dynamically-Invoke-Generic-Methods

      【讨论】:

      • 谢谢,幸运的是,其他解决方案已经减轻了对此的需求,但这基本上是我认为我必须知道但并不真正知道如何
      【解决方案3】:

      我会创建一个具有扩展属性的基础作业:

      • 姓名
      • 类型

      示例:

      public class BaseJob : IJob
      {
          public virtual void Execute(IJobExecutionContext context)
          {
              JobKey jobKey = context.JobDetail.Key;
      
              string message = string.Format("Job Key:{0} - Trigger Key:{1} - Start Time:{2} - Schedule Fire Time: {3}", context.JobDetail.Key, context.Trigger.Key, context.Trigger.StartTimeUtc, context.ScheduledFireTimeUtc);
      
              ILog log = LogManager.GetCurrentClassLogger();
              log.Debug(message);
      
              Console.WriteLine(new String('*', 100));
      
              Console.WriteLine("Trigger Info: " + message);
              Console.WriteLine("Next Schedule: " + context.Trigger.GetNextFireTimeUtc());
      
              Console.WriteLine(new String('*', 100));
          }
      
          public string Name { get; set; }
          public string Group { get; set; }
          public Type Type { get; set; }
      }
      

      这是继承的工作:

      public class InheritedJob1 : BaseJob
      {
      }
      

      现在您可以定义您的工作列表:

      IList<BaseJob> jobs = new List<BaseJob>();
      jobs.Add(new BaseJob() { Name = "Job1", Group = "MYGROUP", Type = typeof(InheritedJob1) });
      jobs.Add(new BaseJob() { Name = "Job2", Group = "MYGROUP", Type = typeof(InheritedJob2) });
      jobs.Add(new BaseJob() { Name = "Job3", Group = "MYGROUP", Type = typeof(InheritedJob3) });
      

      指定每个类型。

      因此您可以轻松安排所有列出的作业:

      foreach (var job in jobs)
      {
          IJobDetail quartzJob = JobBuilder.Create(job.Type)
              .WithIdentity(job.Name, job.Group)
              .Build();
      
          ITrigger quartzTrigger = TriggerBuilder.Create()
                  .WithIdentity("trg_" + job.Name, job.Group)
                  .StartNow()
                  .WithSimpleSchedule(x => x.WithIntervalInSeconds(30).RepeatForever())
                  .Build();
      
          Scheduler.ScheduleJob(quartzJob, quartzTrigger);
      }
      

      您可以下载工作示例here

      【讨论】:

      • 谢谢,我想我会坚持使用静态名称字段等,因为继承的任务真的应该只有一个实例。但我会考虑设置这样的继承类型......问题的症结在于JobBuilder 有一个非泛型Create() 方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多