我正在编写一个调度程序组件,我打算使用 Quartz.net。我的要求是:
- 让调度程序 24x7 运行(停止/失败是可以接受的,它只需要重新启动)
- 能够通过网页查看安排了哪些作业/触发器
- 能够通过网页添加新的工作/触发器
由于我需要一个持续运行的调度程序,因此我计划拥有一个 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 可以读取以获取其工作的关系数据存储,并且该网站也可以读取以查看正在执行的内容。我想要一个关系数据存储来保存作业和触发器,所以也许这是在两个应用程序之间提供数据的最佳方式?