2011-06-28 184 views
8

我在当前项目中使用Quartz.NET创建了一个调度器。就我而言,所有必须创建的作业都存储在一个表中,并且有一个单独的用户界面,可以添加新作业或编辑现有作业。我的问题是我如何能够将表中的所有工作提交给Quartz调度器?我是否想要查询表中的所有作业并遍历它,创建JobDetails和Trigger对象?在这种情况下有没有更好的方法?Quartz.Net作业存储查询

在这种情况下我想用RAMJobStore或AdoJobStore?

回答

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

UPDATE

所有你必须创建Quartz.net表的第一(见Step 1),然后你就必须为optiomization创建几个指标(见page的底部)。

既然你要使用Web应用程序来提交您的工作,但你没有使用该应用为你不需要启动调度的quartz.net事件(触发)。 有几个步骤,遵循这一边:

你有线程池类型更改为ZeroSizeThreadPool

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

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

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

要记住的另一件事是你需要在你的web和你的windows服务之间共享你的job,所以最好把它保存在一个单独的程序集中。

你提到过你在一张表中存储了一些信息。 你仍然需要提交你的工作,并触发哪些将保存在Quartz.net表中。

+0

感谢您的回复。我在数据库中有一张表,用于存储业务的所有工作信息。调度程序在Windows服务中运行,并通过ASP.NET应用程序将作业添加到此表中或进行编辑。那么我如何在这种情况下使用Quartz.NET?无论何时添加或编辑作业,都必须更新调度程序。 – Dnana

+0

@Dnana:是你的windows服务还是Quartz.net的windows服务? – LeftyX

+0

.net windows服务。在这种情况下,我不确定哪一个更好。 – Dnana