我正在编写调度器组件,并计划使用Quartz.net。我的要求是:
因为我需要一个不断运行的调度程序,所以我计划有一个Windows服务。不幸的是,似乎没有任何方式让网页与运行在Windows服务中的调度程序进行交互。我试图从图兰·阿罗拉的示例中检索一个包含以下代码的实例
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‘的Scheduler已经存在。”(ServerScheduler是默认的调度程序名。)经过阅读,解决方案似乎是实现一个单例模式,在调度程序的整个生命周期内实例化并返回此实例。
这似乎不是理想的解决方案,因为我想要两个部分-一个调度程序Windows服务和一个网站。显然,网站不应该拥有调度程序,因为有一件事,它可能正在使用,也可能不使用24x7,而我需要计划的作业才能执行24x7。第二,我不希望我的网站与Windows服务通信,以获得对调度程序的引用来获取这些信息。
我相信在这种情况下,我误解了使用Quartz.net的体系结构。但是,如果我是正确的,也许解决方案是维护一个关系数据存储,Quartz.net可以读取它的工作,网站也可以读取来查看正在执行的内容。无论如何,我想要一个关系数据存储来持久化作业和触发器,所以也许这是在两个应用程序之间提供数据的最好方法?
发布于 2013-09-24 04:02:43
在这种情况下,您想要做的是像您已经尝试过的那样通过远程处理进行连接,只需确保在同一台具有不同实例名称的机器上运行Quartz.NET进程。
如果您已经决定使用AdoJobStore运行,那么一个简单的选择就是从web应用程序连接到同一个作业存储区,而不实际启动调度程序。您可以从web应用程序中查询和修改作业存储作业和触发器,并让服务运行作业的实际触发。下面是一个与所描述的场景相关的答案。
https://stackoverflow.com/questions/18965628
复制相似问题