【问题标题】:'Job Exists' error when using AdoJobStore使用 AdoJobStore 时出现“作业存在”错误
【发布时间】:2014-10-13 03:59:34
【问题描述】:

“无法存储作业:无法存储作业:'QbBackupGroup.QbBackup',因为具有此标识的已存在。”

第一次在干净的数据库 (SQLCE) 上运行后,我随时都会收到此信息。我搜索并找到了一些建议(即herehere),但它们与运行 Quartz.NET 相关 TopShelf。

建议的代码基于标准 Quartz.NET 架构(例如变量和值),但 TopShelf 的 Quartz.NET 代码都是委托。似乎没有什么可以直接翻译。

我的代码如下。

但是......所有这些......这可能并不重要,因为我的最终目标是能够在运行时添加/删除作业/触发器而无需重新启动服务。这种硬编码的设计甚至可能不适用,但我还没有弄清楚如何做运行时位。

如果我能克服这个问题,接下来就是运行时位。除非运行时位否定对此的需要。第 21 条军规。

请指教。

服务:

Sub Main()
    Dim oSchedule As Action(Of SimpleScheduleBuilder)
    Dim oTrigger As Func(Of ITrigger)
    Dim oDetail As Func(Of IJobDetail)
    Dim oJob As Action(Of QuartzConfigurator)

    oSchedule = Function(ScheduleBuilder) As SimpleScheduleBuilder
                  Return ScheduleBuilder.WithIntervalInSeconds(5).RepeatForever
                End Function

    oTrigger = Function() As ITrigger
                 Return TriggerBuilder.Create.WithIdentity(QbBackup.Job.Trigger, QbBackup.Job.Group).WithSimpleSchedule(oSchedule).Build
               End Function

    oDetail = Function()
                Return JobBuilder.Create(Of QbBackup.Job).WithIdentity(QbBackup.Job.Name, QbBackup.Job.Group).Build
              End Function

    oJob = Function(Configurator As QuartzConfigurator)
             Return Configurator.WithJob(oDetail).AddTrigger(oTrigger)
           End Function

    HostFactory.Run(Sub(Configurator)
                      Configurator.Service(Of Manager)(Sub(Service)
                                                         Service.ConstructUsing(Function(Factory) As ServiceControl
                                                                                  Return New Manager
                                                                                End Function)

                                                         Service.WhenStarted(Function(Notifier, HostControl) As Boolean
                                                                               Return Notifier.StartService(HostControl)
                                                                             End Function)

                                                         Service.WhenStopped(Function(Notifier, HostControl) As Boolean
                                                                               Return Notifier.StopService(HostControl)
                                                                             End Function)

                                                         Service.ScheduleQuartzJob(oJob)
                                                       End Sub)

                      Configurator.SetDescription(SchedulerInfo.Description)
                      Configurator.SetServiceName(SchedulerInfo.Product)
                      Configurator.SetDisplayName(SchedulerInfo.Title)
                      Configurator.StartAutomatically()
                      Configurator.RunAsLocalSystem()
                    End Sub)
End Sub

工作:

Imports Common.Logging

Public Class Job
  Implements IJob

  Private Shared Logger As ILog = LogManager.GetLogger(GetType(Job))

  Public Sub Execute(Context As IJobExecutionContext) Implements IJob.Execute
    Try
      Job.Logger.Info(Now.ToString)

    Catch ex As Exception
      Throw New JobExecutionException(ex.Message, ex)

    End Try
  End Sub



  Public Shared ReadOnly Property Name As String
    Get
      Return QbBackupInfo.Product
    End Get
  End Property



  Public Shared ReadOnly Property Trigger As String
    Get
      Return "{0}Trigger".ToFormat(Job.Name)
    End Get
  End Property



  Public Shared ReadOnly Property Group As String
    Get
      Return "{0}Group".ToFormat(Job.Name)
    End Get
  End Property
End Class

App.config:

<quartz>
  <!-- Configure Scheduler -->
  <add key="quartz.scheduler.instanceName" value="Scheduler" />
  <add key="quartz.scheduler.instanceId" value="Scheduler" />
  <!-- Configure Thread Pool -->
  <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
  <add key="quartz.threadPool.threadCount" value="10" />
  <add key="quartz.threadPool.threadPriority" value="Normal" />
  <!-- Configure Job Store -->
  <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" />
  <!-- Configure Data Source -->
  <add key="quartz.dataSource.default.connectionString" value="Data Source=C:\ProgramData\Scheduler\Scheduler.sdf;Max Database Size=4091;Persist Security Info=False;" />
  <add key="quartz.dataSource.default.provider" value="SqlServerCe-400" />
</quartz>

【问题讨论】:

    标签: quartz.net topshelf


    【解决方案1】:

    作业组及其名称的组合是作业在 Quartz.Net 中的唯一键。它们在所有工作中都应该是独一无二的。触发器也是如此。如果您确实需要运行多个相同类型的作业,则修复方法是更改​​每个作业的作业名称。您也可以只做一份带有多个触发器的工作。每个触发器都有自己的数据映射,因此您可以在其中添加自定义信息。解决此问题的一种方法是为作业名称附加时间戳,以便它们都具有唯一名称。

    【讨论】:

    • 您好,Jay,感谢您的回复。仅供参考,我在Google Groups question 上也是如此。实际上,我不需要运行多个相同类型的作业——我只是想让 AdoJobStore 支持的作业/计划再次运行。这是“运行时调度”问题的伴随问题——我相信一个问题的答案将是另一个问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多