我在尝试让Quartz.NET与AdoJobStore一起工作时遇到了问题。这里没有任何其他问题似乎正在解决我的问题。我能够在没有AdoJobStore配置的情况下正常工作,但希望将所有内容保存到最后,但是在尝试GetScheduler()
时出现错误,我无法弄清楚。用SQL Server AdoJobStore配置Quartz.NET
这里是我的石英app.config
部分:
<quartz>
<add key="quartz.scheduler.instanceName" value="XxxDefaultQuartzScheduler"/>
<add key="quartz.scheduler.instanceId" value="instance_one"/>
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
<add key="quartz.threadPool.threadCount" value="10"/>
<add key="quartz.threadPool.threadPriority" value="1"/>
<add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"/>
<add key="quartz.jobStore.misfireThreshold" value="60000"/>
<add key="quartz.jobStore.dataSource" value="default"/>
<add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz"/>
<add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz"/>
<add key="quartz.jobStore.tablePrefix" value="QRTZ_"/>
<add key="quartz.dataSource.default.connectionString" value="Server=(local);Database=Quartz;UID=XXXX;PWD=XXXX"/>
<add key="quartz.dataSource.default.provider" value="SqlServer-20"/>
<add key="quartz.dataSource.useProperties" value="true"/>
</quartz>
下面是相关的初始化代码:
var config = (NameValueCollection) ConfigurationManager.GetSection("quartz");
ISchedulerFactory factory = new StdSchedulerFactory(config);
// This is where an ArgumentOutOfRange exception occurs:
IScheduler scheduler = factory.GetScheduler();
而且我得到的错误是ArgumentOutOfRangeException
:
长度不能少比零。\ r \ n参数名称:长度
通过代码,我可以验证配置部分步进被正确读取,我再三地检查拼写错误和配置属性的错误的资本。我已经验证了数据库可以通过我拥有的connectionString
访问。
当我在代码中检查并检查即时窗口中的工厂变量时,我注意到的一件事是,它总是说“AllSchedulers:Count = 0” - 不确定是否因为我还没有实例化一个或者如果这是我的问题的一部分。试图给GetScheduler()
的instanceName
从配置 -
factory.GetScheduler("XxxDefaultQuartzScheduler")
也不起作用。
我在想什么/做错了什么?请指教。
作为任何人访问这个问题,'quartz.jobStore.lockHandler.type'属性应该被移除,因为它迫使石英使用效率较低的锁定策略,这将产生警告你的日志。 –