使用Quartz.NET作为Windows服务

时间:2013-09-23 17:47:40

标签: asp.net windows-services quartz.net

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

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

  4. 由于我需要不断运行调度程序,因此我计划使用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服务和一个网站。显然,网站不应该拥有调度程序,因为有一件事它可能会或可能不会全天候使用,我需要预定的作业能够全天候执行。其次,我不认为我希望我的网站与Windows服务进行通信,以获取对调度程序的引用以获取此信息。

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

1 个答案:

答案 0 :(得分:2)

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

如果您已经决定使用AdoJobStore运行,那么一个简单的选择是从Web应用程序连接到同一个作业存储,而无需实际启动调度程序。您可以从Web应用程序查询和修改作业存储作业和触发器,并让服务运行实际的作业触发。 Here's an answer related to described scenario