2010-07-08 37 views
3

我们有一个作为Windows服务运行的Quartz.Net安装。这运行良好。我们还有一个ASP.Net应用程序,用于添加/编辑作业并监视作业。我们偶尔会在ASP.Net应用程序中出现错误。错误是“计划程序已关闭”。或“名称为'JOB_SCHEDULER_NAME'的计划程序已存在。”从ASP.Net应用程序检索Quartz.net作业信息

如果刷新页面,它工作正常。我已经能够通过反复快速打开同一页面的多个实例来重新创建问题。所以,我目前的理论是,我们得到Scheduler实例的方式不是线程安全的。

作为一个例子,这里是我们如何获取工作信息的简化版本:

var schedulerFactory = new StdSchedulerFactory(); 
var scheduler = schedulerFactory.GetScheduler(); 
var jobDetail = scheduler.GetJobDetail("SomeJobName", "SomeJobGroup"); 

在ASP.Net应用程序加载页面时,这是正在做。

的ASP.Net的配置设置是:

<quartz> 
    <add key="quartz.scheduler.instanceName" value="COMPANY_NAME_JobScheduler" /> 
    <add key="quartz.scheduler.instanceId" value="Provider.DEV" /> 
    <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" /> 
    <add key="quartz.jobStore.useProperties" value="true" /> 
    <add key="quartz.jobStore.dataSource" value="default" /> 
    <add key="quartz.jobStore.tablePrefix" value="QRTZ_" /> 
    <add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" /> 
    <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz " /> 
    <add key="quartz.dataSource.default.connectionString" value="server=PROD_SQL_SERVER;uid=SQL_USER;pwd=SQL_PASSWORD;database=Scheduler" /> 
    <add key="quartz.dataSource.default.provider" value="SqlServer-20" /> 
</quartz> 

Windows服务正在初始化这样的调度:

var schedulerFactory = new StdSchedulerFactory(); 
var scheduler = schedulerFactory.GetScheduler(); 

Windows服务配置为:

<quartz> 
    <add key="quartz.scheduler.instanceName" value="COMPANY_NAME_JobScheduler" /> 
    <add key="quartz.scheduler.instanceId" value="Service.PROD" /> 

    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" /> 
    <add key="quartz.threadPool.threadCount" value="10" /> 
    <add key="quartz.threadPool.threadPriority" value="2" /> 

    <add key="quartz.jobStore.misfireThreshold" value="60000" /> 
    <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" /> 
    <add key="quartz.jobStore.useProperties" value="true" /> 
    <add key="quartz.jobStore.dataSource" value="default" /> 
    <add key="quartz.jobStore.tablePrefix" value="QRTZ_" /> 
    <add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" /> 
    <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz " /> 

    <add key="quartz.dataSource.default.connectionString" value="server=PROD_SQL_SERVER;uid=SQL_USER;pwd=SQL_PASSWORD;database=Scheduler" /> 
    <add key="quartz.dataSource.default.provider" value="SqlServer-20" /> 
</quartz> 

是有更好的方法来“查询”调度程序?

编辑:增加了更多的配置信息

+0

需要更多信息。例如:什么是调度器工厂配置? (无论是在客户端还是在服务器端)。你在哪里实例化客户端中的调度器工厂和调度器? – 2010-07-08 21:19:49

+0

增加了更多信息。这有帮助吗? – 2010-07-08 21:31:43

回答

5

我们已经设置了调度是在我们的应用中单,这解决了问题我们:

public class MyScheduler 
{ 
    static MyScheduler() 
    { 
     _schedulerFactory = new StdSchedulerFactory(getProperties()); 
     _scheduler = _schedulerFactory.GetScheduler(); 
    } 
    public static IScheduler GetScheduler() 
    { 
     return _scheduler; 
    } 

    private static readonly ISchedulerFactory _schedulerFactory; 
    private static readonly IScheduler _scheduler; 
} 
+0

我也遇到了类似的问题。你能解释一下为什么我们需要将它转移到单身人士课堂上。在我的appp中,我需要在一天内创建数千个工作,我有点担心单身类的负载。 – Brainchild 2013-06-03 11:05:39

0

而是同时具有调度的直接连接到数据库,请尝试使Web调度程序连接到服务调度程序through remoting