【问题标题】:Quartz.Net Job Storage QueryQuartz.Net 作业存储查询
【发布时间】:2011-06-28 08:38:03
【问题描述】:

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

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

【问题讨论】:

    标签: quartz.net


    【解决方案1】:

    您可以使用 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),然后您必须创建一些索引以进行优化(参见底部 page)。

    由于您要使用网络应用程序提交作业,但您没有使用该应用程序来处理quartz.net 事件(触发器),因此您无需启动调度程序。 在这方面有几个步骤可以遵循:

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

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

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

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

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

    您提到您将一些信息存储在您的一张表中。 您仍然需要提交您的作业和触发器,它们将保留在 Quartz.net 表中。

    【讨论】:

    • 感谢您的回复。我在数据库中有一个表,用于存储企业的所有工作信息。调度程序在 Windows 服务中运行,并通过 ASP.NET 应用程序将作业添加到此表中或进行编辑。那么在这种情况下如何使用 Quartz.NET 呢?每当添加或编辑作业时,都必须更新调度程序。
    • @Dnana: 那是你的windows服务还是Quartz.net windows服务?
    • .net windows 服务。我不确定在这种情况下哪个更好。
    • @Dnana:是的,我选择了相同的解决方案。我有一个提交作业的 Web 应用程序 (UI) 和一个负责 Quartz.net 触发器的自定义 Windows 服务。
    • 如果我使用 Quartz 表,那么我不能直接插入或更新作业 rgt?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多