0

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

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

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

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

无论如何,我的问题是有没有一种方法可以从数据库中检索所有作业/触发器,而不管石英.net 2.x 中调度程序的实例名称如何,如果没有,是否有关于如何解决此问题的任何想法?另外,有没有人知道为什么要SCHED_NAME添加到所有表中,为什么调度程序名称现在在 2.x 中如此重要,以及进行此更改背后的想法是什么?

编辑:哇,刚刚花了几个小时试图弄清楚这一点,看起来(除非我遗漏了什么)Quartz.net 2 由于这个调度程序名称问题而存在严重缺陷,这就是为什么......

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

4

1 回答 1

0

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

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

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

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

于 2013-02-26T23:14:28.840 回答