如何在我的Job上使用属性而不是Quartz.NET中的JobDataMap字典?

时间:2010-10-14 03:42:55

标签: scheduled-tasks quartz.net

我正在开发一项Windows服务,它需要在调用其中一个Web服务时安排任务。在最坏的情况下,这可能每秒发生数百次。任务需要等待一段时间,通常是一两分钟,然后调用传递参数的方法。

我们尝试构建自己的调度程序类来执行此操作:

public void ScheduleTask<T>(TimeSpan delay, Action<T> task, T arg)
{
    Thread.Sleep(delay);
    threadPool.ExecuteAsync(task, arg);
}

但是我们认为这不合适,因为理论上我们最终可能会有数百个线程池线程等待。我的印象是,可用的线程池线程数量有限,这可能会锁定系统。

然后我转向Quartz.NET并在their features page上阅读:

  

Job类实例可以由Quartz.NET实例化,也可以由应用程序框架实例化。

并且在page 3 of their tutorial上,Scheduler创建了Job类的实例(不是你),因此:

  

在作业类上定义数据成员是没有意义的,因为每次作业执行时它们的值都会被“清除”。

随意对我大喊大叫,但如何在执行之前获取对Job类实例的引用,以便我可以在其上设置属性?

  • 该物业正在做一个 参数所以我对它没兴趣 在约伯执行之后。
  • 我也想减少数量 实现此目的所需的对象 保持我的代码整洁简单
  • 最后,我非常不喜欢使用 字典因此宁愿避免使用JobDataMap对象。

1 个答案:

答案 0 :(得分:1)

我不明白你的用例是什么以及为什么你需要在工作中设置一个属性,但要回答你的问题:要在你的工作执行之前访问你的工作,你需要创建一个工作监听器(实现IJobListener)。在作业执行之前调用作业侦听器,因此您可以在该点设置属性。

一些链接: The documentation on job listeners

我写了一篇博文,详细介绍了听众的创作,here