0

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

第一次在干净的数据库(SQLCE)上运行后,我随时都会得到这个。我搜索并找到了一些建议(即此处此处),但它们与在没有TopShelf 的情况下运行 Quartz.NET有关。

建议的代码基于标准 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

应用程序配置:

<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>
4

1 回答 1

1

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

于 2014-10-14T17:27:15.603 回答