2014-12-03 133 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