Quartz.Net作业存储查询

时间:2011-06-28 08:38:04

标签: quartz.net

我正在当前项目中使用Quartz.NET创建调度程序。在我的情况下,所有必须创建的作业都存储在一个表中,并且有一个单独的UI,我可以在其中添加新作业或编辑现有作业。我的问题是如何将表中的所有作业提供给Quartz调度程序?我是否要查询表中的所有作业并迭代创建JobDetails和Trigger对象?在这种情况下有没有更好的方法?

在这种情况下,我想使用RAMJobStore还是AdoJobStore?

1 个答案:

答案 0 :(得分:17)

你可以使用AdoJobStore Quartz.net将在数据库中使用一组前缀为QRTZ_的表(您可以根据需要将其更改)到存储的作业,触发器和这些对象的状态。
我想你想在你的数据库中有一张表,你要在那里保留有关你的时间表的扩展信息,对吧? 您不会直接访问Quartz.net表,因为您将使用Quartz.net提供的API。

创建作业详细信息和触发器的过程非常简单,并在tutorials中进行了很好的描述。

要将您的应用配置为使用AdoJobStore,您必须在app.config文件中指定一些信息。 这是一个例子:

  <quartz>
    <add key="quartz.scheduler.instanceName" value="myApp" />
    <add key="quartz.scheduler.instanceId" value="MyApp" />
    <!-- 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" />
    <add key="quartz.dataSource.default.connectionString" 
        value="Server=SVSQL2008;Database=QuartzNet1;Trusted_Connection=True;" />
    <add key="quartz.dataSource.default.provider" value="SqlServer-20" />
   </quartz>

如果您在Web应用程序或服务或winform应用程序中托管Quartz.net,则需要记住几件事。 最好的方法是将SchedulerFactory和Scheduler创建为单例。 您可以收集更多信息here

<强>更新

首先,您必须创建Quartz.net表(请参阅Step 1),然后您必须为optiomization创建一些索引(请参阅page的底部)。

由于您要使用Web应用程序提交作业,但您没有将该应用程序用于quartz.net事件(触发器),因此您无需启动计划程序。 这一步有几个步骤可以遵循:

您必须将线程池类型更改为 ZeroSizeThreadPool

<add key="quartz.threadPool.type" 
                   value="Quartz.Simpl.ZeroSizeThreadPool, Quartz" />

你必须定义你的StdSchedulerFactory和Scheduler单例。您可以在应用程序(asp.net)bootstrap期间启动。

你永远不会启动调度程序(你的Windows服务将使用它)。

另一件需要记住的事情是,您需要在网络和Windows服务之间共享job,因此最好将其保存在单独的程序集中。

你提到你在一张桌子里存放了一些信息。 您仍然需要提交您的作业和触发器,这些作业将保留在Quartz.net表中。