2014-12-03 135 views
0

我正尝试在集群环境中运行quartz.net(2石英服务使用单个数据库作为作业数据存储)。我在下面的quartz.exe.config设置quartz.jobStore.clustered = true和其他属性Quartz.net聚集投掷错误

<quartz> 
    <add key="quartz.jobStore.tablePrefix" value="Qrtz_"/> 
    <add key="quartz.jobStore.misfireThreshold" value="60000"/> 
    <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"/> 
    <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz"/> 
    <add key="quartz.jobStore.dataSource" value="myDS"/> 
    <add key="quartz.dataSource.myDS.connectionString" value="Server=DEV1;user=dev2;password=P&ssW0rd;database=DATAU"/> 
    <add key="quartz.jobStore.useProperties" value="false"/> 

    <add key="quartz.dataSource.myDS.provider" value="SqlServer-20"/> 
    <add key="quartz.scheduler.exporter.type" value="Quartz.Simpl.RemotingSchedulerExporter, Quartz"/> 
    <add key="quartz.scheduler.exporter.port" value="555"/> 
    <add key="quartz.scheduler.exporter.bindName" value="QuartzScheduler"/> 
    <add key="quartz.scheduler.exporter.channelType" value="tcp"/> 
    <add key="quartz.scheduler.exporter.channelName" value="httpQuartz"/> 
    <add key="quartz.jobStore.clustered" value="true" /> 
</quartz> 

不过,我得到以下错误

错误Quartz.Impl.AdoJobStore.JobStoreTX - ClusterManager:错误管理集群:获取db行锁定失败:第1行:FOR UPDATE子句只允许DECLARE CURSOR。

我正在使用SQL2012(应用最新的Service Pack)作为作业存储。

此外,我试图替换以下属性锁定查询如下

<add key="quartz.jobStore.selectWithLockSQL" value="SELECT * FROM &#123;0&#125;LOCKS UPDLOCK WHERE LOCK_NAME = '?'" /> 

如果我这样做,我收到以下错误

[QuartzScheduler_QuartzScheduler-NON_CLUSTERED_MisfireHandler] ERROR Quartz.Impl。 AdoJobStore.JobStoreTX - MisfireHandler:错误处理失误:获取数据库行锁定失败:违反PRIMARY KEY约束'PK_QRTZ_LOCKS'。无法在对象'dbo.QRTZ_LOCKS'中插入重复键。重复的键值是(QuartzScheduler,TRIGGER_ACCESS)。

的要求,在评论,这里是我的全部工作配置

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
<configSections> 
    <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 
    <sectionGroup name="common"> 
     <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/> 
    </sectionGroup> 
</configSections> 
<common> 
    <logging> 
     <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net1211"> 
      <arg key="configType" value="INLINE"/> 
     </factoryAdapter> 
    </logging> 
</common> 
<connectionStrings> 
    <add name="EARTHEntities" connectionString="metadata=res://*/DatabaseModel.EarthModel.csdl|res://*/DatabaseModel.DBhModel.ssdl|res://*/DatabaseModel.DBModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=server;initial catalog=db;user=remoteuser;password=pwd;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/> 
</connectionStrings> 
<log4net> 
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date [%thread] %-6level %logger - %message %exception%newline"/> 
     </layout> 
    </appender> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date [%thread] %-6level %logger - %message %exception%newline"/> 
     </layout> 
    </appender> 
    <appender name="GeneralLog" type="log4net.Appender.RollingFileAppender"> 
     <file value="Quartz.log"/> 
     <appendToFile value="true"/> 
     <rollingStyle value="Date"/> 
     <datePattern value="yyyyMMdd"/> 
     <maxSizeRollBackups value="1"/> 
     <maximumFileSize value="5MB"/> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO"/> 
     <appender-ref ref="GeneralLog"/> 
     <appender-ref ref="EventLogAppender"/> 
     <appender-ref ref="ConsoleAppender"/> 
    </root> 

</log4net> 
<!-- 
    We use quartz.config for this server, you can always use configuration section if you want to. 
    Configuration section has precedence here. 
--> 
<quartz> 
    <add key="quartz.jobStore.tablePrefix" value="Qrtz_"/> 
    <add key="quartz.jobStore.misfireThreshold" value="60000"/> 
    <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"/> 
    <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz"/> 
    <add key="quartz.jobStore.dataSource" value="myDS"/> 
    <add key="quartz.dataSource.myDS.connectionString" value="Server=server;user=remoteuser;password=pwd;database=db"/> 
    <add key="quartz.jobStore.useProperties" value="false"/> 

    <add key="quartz.dataSource.myDS.provider" value="SqlServer-20"/> 
    <add key="quartz.scheduler.exporter.type" value="Quartz.Simpl.RemotingSchedulerExporter, Quartz"/> 
    <add key="quartz.scheduler.exporter.port" value="555"/> 
    <add key="quartz.scheduler.exporter.bindName" value="QuartzScheduler"/> 
    <add key="quartz.scheduler.exporter.channelType" value="tcp"/> 
    <add key="quartz.scheduler.exporter.channelName" value="httpQuartz"/> 
    <add key="quartz.jobStore.clustered" value="true" /> 
    <add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz"/> 
    <add key="quartz.scheduler.instanceId" value="AUTO" /> 
</quartz> 

+0

你能发表(追加到你原来的帖子)..你的完整和工作配置?谢谢。 – granadaCoder 2014-12-03 16:23:07

+0

@granadaCoder我现在已经这样做了。 – utkarsh 2014-12-04 11:16:32

回答

0

尝试用此配置设置播放:

properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.MSSQLDelegate, Quartz"; 

等待,一个可能老...

也许这一个:

<add key="quartz.jobStore.lockHandler.type" 
value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz"/> 

从这个例子中找到:

https://groups.google.com/forum/#!topic/quartznet/Csw2un9KUy0

我从内存中去....我没有工作的例子,我曾经有过.. ...

下面是一些代码,以帮助弄清楚这一个:

因此,也许用“Quartz.Impl.AdoJobStore.SqlServerDelegate”,而不是“第四纪rtz.Impl.AdoJobStore.StdAdoDelegate“是一个选项。

namespace Quartz.Impl.AdoJobStore 
{ 
    /// <summary> 
    /// A SQL Server specific driver delegate. 
    /// </summary> 
    /// <author>Marko Lahma</author> 
    public class SqlServerDelegate : StdAdoDelegate 
    { 


namespace Quartz.Impl.AdoJobStore 
{ 
    /// <summary> 
    /// Provide thread/resource locking in order to protect 
    /// resources from being altered by multiple threads at the same time using 
    /// a db row update. 
    /// </summary> 
    /// <remarks> 
    /// <para> 
    /// <b>Note:</b> This Semaphore implementation is useful for databases that do 
    /// not support row locking via "SELECT FOR UPDATE" or SQL Server's type syntax. 
    /// </para> 
    /// <para> 
    /// As of Quartz.NET 2.0 version there is no need to use this implementation for 
    /// SQL Server databases. 
    /// </para> 
    /// </remarks> 
    /// <author>Marko Lahma (.NET)</author> 
    public class UpdateLockRowSemaphore : DBSemaphore 
    { 
+0

使用SQLServerDelegate时不应该添加quartz.jobStore.lockHandler.type,它会自动添加必要和最优配置。 – 2014-12-04 05:59:56