.Net Quartz Windows服务解决了作业依赖关系

时间:2015-08-20 15:26:32

标签: .net quartz-scheduler quartz.net

我刚刚开始使用Quartz.Net - 基本上我想将它作为Windows服务运行,并使用IJob界面安排不同程序集中的作业。 要在默认情况下执行此操作,我需要将包含Jobs(及其所有依赖项)的程序集放在Quartz.exe的根文件夹中。一切都好 - 我有这个工作。 但是,我想将不同程序集中的不同作业放入根目录下的特定文件夹中。当我这样做时,Quartz无法解决依赖关系 - 我意识到我可以创建自己的程序集解析器但是我不知道在哪里放置它或应该实例化它 - 任何帮助都会很棒。

我尝试创建自己的JobFactory并根据提供的路径解析那里的dependecies。然而,由于某些原因,JobFactory失败了,因为它无法找到Job dependecies - 这令人费解,因为Job只在JobFactory.NewJob方法中创建,如下所示:

  public class MyQuartzJobFactory : IJobFactory

{     //这行是否因为无法找到依赖而失败     private static readonly ILog log = LogManager.GetLogger(typeof(MyQuartzJobFactory));

public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
  IJobDetail jobDetail = bundle.JobDetail;
  Type jobType = jobDetail.JobType;
  try
  {
    if (log.IsDebugEnabled)
    {
      log.Debug(string.Format(CultureInfo.InvariantCulture, "Producing instance of Job '{0}', class={1}", jobDetail.Key, jobType.FullName));
    }

    string path = "";
    if (jobDetail.JobDataMap.ContainsKey("custPath"))
    {
      path = jobDetail.JobDataMap["custPath"].ToString();
    }

    return ObjectUtils.InstantiateType<IJob>(jobType);
  }
  catch (Exception e)
  {
    SchedulerException se = new SchedulerException(string.Format(CultureInfo.InvariantCulture, "Problem instantiating class '{0}'", jobDetail.JobType.FullName), e);
    throw se;
  }
}

/// <summary>
/// Allows the job factory to destroy/cleanup the job if needed. 
/// No-op when using SimpleJobFactory.
/// </summary>
public void ReturnJob(IJob job)
{
  var disposable = job as IDisposable;
  if (disposable != null)
  {
    disposable.Dispose();
  }
}

}

1 个答案:

答案 0 :(得分:1)

如果在可执行文件所在的文件夹中有程序集,则在配置文件中使用probing element可能更容易。或者,看看server example如何安装服务并创建自己的服务,在其中设置程序集依赖关系。