如何使用不同名称的零线程调度程序实例创建JobDetails / Triggers?

时间:2013-02-19 19:33:22

标签: quartz.net-2.0

我正在从Quartz.net 1.x迁移到2.x,由于某种原因,创建作业/触发器的调度程序的实例名称现在显得非常重要...添加了列SCHED_NAME对于大多数石英表而言,如果创建这些作业/触发器的零线程调度程序实例与用于获取和显示它们的实例具有不同的名称,则无法获取存储在数据库中的所有作业/触发器...

以下是关于我如何使用石英来帮助您更好地理解问题的更多细节......

我有一个用于创建大多数作业/触发器的UI,当我使用quartz.net 1.x时,我创建了具有不同名称的零线程调度程序的实例,具体取决于应用程序的功能区域,我没有问题通过具有不同名称的实例检索所有这些触发器。 当我开始使用quartz.net 2.x时,实例创建的作​​业/触发器的名称与用于检索现有触发器的实例不同,后者在使用IScheduler.GetJobDetailIScheduler.GetTriggersOfJob函数时未返回的UI中显示我修改了UI以使用单个实例并解决了这个问题。

但是,我也有一个Windows服务,每次将文件放入FileSystemWatcher .NET对象观察到的热文件夹时,此服务都会实例化我的自定义文件处理器对象,因此此文件处理器对象的每个实例都必须创建一个具有唯一名称的quartz.net零线程调度程序,以便安排作业处理被删除的文件,因为可以同时删除多个文件,并且如果两个文件处理器对象实例尝试创建该实例quart.net零线程调度程序,其名称相同,会在quartz.net中导致异常。因此,UI服务中使用的零线程调度程序不再可见由Windows服务创建的这些作业/触发器,并且我的UI中不再显示由Windows服务创建的这些触发器。

无论如何,我的问题是有没有办法从数据库中检索所有作业/触发器,无论quartz.net 2.x中的调度程序的实例名称如何,如果没有,是否有任何关于如何解决的想法这个问题? 此外,是否有人对为什么SCHED_NAME添加到所有表中有任何见解,为什么调度程序名称现在在2.x中如此重要以及进行此更改背后的想法是什么?

编辑:哇,只花了几个小时试图解决这个问题,看起来(除非我遗漏了一些东西)Quartz.net 2由于这个调度程序名称问题而存在严重缺陷,这就是为什么... < / p>

由多线程调度程序的实例名称与零线程调度程序创建的任何触发器将被多线程调度程序忽略,并且如果使用的所有调度程序具有相同的实例名称(或者您让Quartz.net为所有调度程序提供默认实例名称)在多个并发线程上创建触发器变得不可能,因为在这些线程上创建的所有零线程调度程序都是使用相同的名称创建的,这将导致Quartz中的异常...

1 个答案:

答案 0 :(得分:0)

我能找到的唯一解决方案是完全放弃为零线程或多线程调度程序提供实例名称。

这导致所有调度程序名称默认为QuartzScheduler,这使得任何调度程序创建的所有作业/触发器对我的UI使用的零线程调度程序可见,以显示和管理作业/触发器...... < / p>

我还通过将多个文件一次性放入hot文件夹来测试我的热文件夹,这导致多个自定义FileProcessor对象的实例化,每个对象使用自己的零线程调度程序,并且Quartz没有引发异常所有这些同时创建的零线程调度程序使用相同的默认名称。

我希望能够继续为不同的调度程序使用不同的实例名称,但这解决了问题,因此这是一个可接受的解决方案。