2

我正在编写一个调度程序组件,我打算使用 Quartz.net。我的要求是:

  1. 让调度程序 24x7 运行(停止/失败是可以接受的,它只需要重新启动)
  2. 能够通过网页查看安排了哪些作业/触发器
  3. 能够通过网页添加新的工作/触发器


由于我需要一个持续运行的调度程序,因此我计划拥有一个 Windows 服务。不幸的是,似乎没有任何方法可以让网页与在 Windows 服务中运行的调度程序进行交互。我尝试使用Turan Arora的示例中的以下代码检索一个实例:

        NameValueCollection properties = new NameValueCollection();
        properties["quartz.scheduler.instanceName"] = "ServerScheduler";

        // set thread pool info
        properties["quartz.threadPool.threadCount"] = "0";

        // set remoting expoter
        properties["quartz.scheduler.proxy"] = "true";
        properties["quartz.scheduler.proxy.address"] = "tcp://localhost:555/QuartzScheduler";

        // get a reference to the scheduler
        ISchedulerFactory sf = new StdSchedulerFactory(properties);
        IScheduler sched = sf.GetScheduler();


走这条路线会给我一个错误消息:“名称为 'ServerScheduler' 的调度程序已经存在。” (ServerScheduler 是默认的调度程序名称。)经过一番阅读,似乎解决方案是实现一个单例模式,以在调度程序的整个生命周期内实例化并返回此实例。

这似乎不是理想的解决方案,因为我想要两个部分——调度程序 Windows 服务和网站。显然,网站不应该拥有调度程序,因为一方面它可能会或可能不会 24x7 使用,我需要计划的作业能够 24x7 执行。其次,我认为我不希望我的网站与 Windows 服务进行通信以获取对调度程序的引用以获取此信息。

我相信我在这种情况下误解了使用 Quartz.net 的架构。但是,如果我是正确的,也许解决方案是维护一个 Quartz.net 可以读取以获取其工作的关系数据存储,并且该网站也可以读取以查看正在执行的内容。我想要一个关系数据存储来保存作业和触发器,所以也许这是在两个应用程序之间提供数据的最佳方式?

4

1 回答 1

2

在这种情况下,您要做的就是像您尝试过的那样通过远程连接进行连接,只需确保您在具有不同实例名称的同一台机器上运行 Quartz.NET 进程即可。

如果您已经决定使用 AdoJobStore 运行,那么一个简单的选择是从 Web 应用程序连接到同一个作业商店,而无需实际启动调度程序。您可以从 Web 应用程序查询和修改作业商店作业和触发器,并让服务运行实际的作业触发。这是与描述的场景相关的答案

于 2013-09-24T04:02:43.903 回答