之前的一些项目是依赖时IIS进程下面,所以很容易就可以获取到相关Quartz的Job、Trigger等状态信息,相关代码也是直接通过官网的示例,并无做过多研究,当然也运行得很好。直到,通过Topshelf依附到Windows Services(以下简称:QA)中,因为需要对Job管理(以下简称:QB)也是必然了,虽说有很多现成的,但出于特殊需求还是自己在内部实现了。(采用工具方式可参考张善友BLOG

环境:ASP.NET、.Net Framework 4.0、IIS6.0。

1、Failed: Scheduler with name ‘XXXScheduler’ already exists.

我想大部分人会跟我一样,在任何一个需要调度的页面,通过以下方式来创建或获取任何一个Job。

ISchedulerFactory factory = new Quartz.Impl.StdSchedulerFactory();
 factory.GetScheduler();

但其实这样默认返回IScheduler,不管是哪种方式的配置,始终是quartz.config或web.config等等为优先。

当我的Web项目里面需要同时管理QA和QB时,由于每一次页面请求都会进行实例,倒置了Scheduler重复。其实真正做法应该是在Application_Start做QA、QB实例,以便我在其他任何页面调用。示例:

protected void Application_Start(object sender, EventArgs e)
 {
   // 远程
   NameValueCollection props = new NameValueCollection();
   props["quartz.scheduler.instanceName"] = "QAScheduler";
   props["quartz.scheduler.proxy"] = "true";
   props["quartz.scheduler.proxy.address"] = string.Format("tcp://{0}:{1}/{2}", "localhost", "555", "QuartzScheduler");
   ISchedulerFactory factory = new Quartz.Impl.StdSchedulerFactory(props);
   factory.GetScheduler();
   // 本地(自动按quartz.config配置项)
   ISchedulerFactory factory_local = new Quartz.Impl.StdSchedulerFactory();
   factory_local.GetScheduler();
 }

其他需要涉及到的页面:

ISchedulerFactory factory = new Quartz.Impl.StdSchedulerFactory();
IScheduler _scheduler = factory.GetScheduler("SchedulerName");// SchedulerName可以通过factory.AllSchedulers来获取。

2、Error communicating with remote scheduler.

这个错误只有在引用远程Quartz管理时才会出现异常,我总结下来会2种情况遇到这种异常:

a、Quartz没有启动。

b、防火墙。

待补充……