我正在创建一个使用Quartz.NET的应用程序,它在Windows服务中使用。还有一个用ASP.NET编写的管理后端,管理员可以在其中添加作业并监视调度程序的状态。但是我遇到了ASP.NET后端的问题。
连接在Global.asax文件中进行,该文件似乎首先起作用 - 当用户登录主仪表板时,它可以正常工作。问题是当用户点击不同的页面时,表示调度程序'schedService'已经存在。
这是我的Windows服务代码:
NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "schedService";
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = threadcount;
properties["quartz.threadPool.threadPriority"] = "Normal";
properties["quartz.jobStore.misfireThreshold"] = "60000";
properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
properties["quartz.jobStore.useProperties"] = "false";
properties["quartz.jobStore.dataSource"] = "default";
properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
//
properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
properties["quartz.scheduler.exporter.port"] = "555";
properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
properties["quartz.scheduler.exporter.channelType"] = "tcp";
//
// if running MS SQL Server we need thisl
properties["quartz.jobStore.lockHandler.type"] = "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz";
// config file
properties["quartz.dataSource.default.connectionString"] = connection;
properties["quartz.dataSource.default.provider"] = "SqlServer-20";
ISchedulerFactory schedService = new StdSchedulerFactory(properties);
IScheduler sched = schedService.GetScheduler();
ASP.NET Global.asax代码:
public static IScheduler Sched()
{
NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "schedMaintenanceService";
properties["quartz.scheduler.proxy"] = "true";
properties["quartz.scheduler.proxy.address"] = "tcp://localhost:555/QuartzScheduler";
ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler sched = sf.GetScheduler();
return sched;
}
然后我在每个ASP.NET页面中使用它:
public static IScheduler sched = Project.Global.Sched();
答案 0 :(得分:2)
你应该把你的IScheduler写成一个单身人士
答案 1 :(得分:0)
我遇到了类似的问题"调度程序已经存在"。我创建了一个单例类,我能够解决问题。
如果有人可以使用它,单例代码看起来像这样。锁定是为了避免以前遇到更多线程试图同时获取同一个实例的问题。
using Quartz;
using Quartz.Impl;
namespace MyProject.CommonObjects.Utilities
{
public static class QuartzFactory
{
private static object _locker = new object();
private static IScheduler _schedulerInstance;
public static IScheduler SchedulerInstance
{
get
{
lock (_locker)
{
if (_schedulerInstance == null)
_schedulerInstance = StdSchedulerFactory.GetDefaultScheduler();
return _schedulerInstance;
}
}
}
}
}
答案 2 :(得分:0)
我找到了另一个解决方案。通过给每个调度程序一个不同的名称,我能够解决这个问题。我觉得这比单身人士更好。
NameValueCollection properties = new NameValueCollection
{
[StdSchedulerFactory.PropertySchedulerInstanceName] = "MyNewScheduler1"
};
StdSchedulerFactory fac = new StdSchedulerFactory(properties);
_scheduler = fac.GetScheduler();
_scheduler.Start();