使用Quartz.NET执行多个存储过程

时间:2013-03-11 14:55:39

标签: sql-server quartz.net

在阅读了所有教程之后,仍然试图围绕Quartz.NET,这些教程看起来非常具有代码性,而不是实现。这就是我想要做的。我有20个SQL存储过程执行各种操作,如查询日志表,重新提交数据到其他进程等。我希望这些SP定期运行一整天。所以对Quartz.NET来说似乎很自然。我计划创建一个实现Quartz.NET的Windows Svc,并在与Quartz程序集相同的文件夹中包含程序集中的作业。

我认为,实现这一目标的一个不好的方法是为每个SP编写一个作业类,并为每个SP关联一个单独的触发器。作业类将只执行一个特定的SP,其名称在类中被硬编码。那是不好的方式。

但是对于我的生活,我无法弄清楚好的方式会是什么。显然,只有一个通用的“按名称执行SP”的作业类,其名称来自一个简单的SQL表,似乎是要走的路,但我如何得到与不同SP相关的不同触发器,以及如何Quartz知道在不同的线程上加载所有20个SP吗?

Quartz如何知道为其中一个SP拾取更改的触发器?那必须是Win Svc上的启动/停止循环来重新加载作业和触发器,还是我还需要手动编写某种“重新加载”?

有什么想法?我误解了Quartz是什么?这个措辞使它听起来像是一个企业调度程序,一个系统,一个你安装的东西。所有文档OTOH使得它看起来像是一堆类,你拼接在一起创建你的OWN调度程序或调度系统,与MS在.NET中提供的类创建你的FTP的例子没有什么不同。也许我期待太多了?

1 个答案:

答案 0 :(得分:1)

满足您要求的一种非常简单的方法可能是:

从示例服务器开始

以Quartz.NET发行版的服务器为起点,你有一个现成的Windows服务模板,利用TopShelf轻松安装

将XML配置与变更检测结合使用

quartz.config文件包含实际配置,您可以看到从XML文件quartz_jobs.xml中读取作业和触发器。

您需要添加 quartz.plugin.xml.scanInterval = 10 来监视更改(每十秒钟)

使用触发器作业数据映射来参数化作业

如果SQL执行与您提议的一样简单,则可以为每个触发器使用相同的作业类。只需添加所需的配置以触发XML中的定义(这里的示例每十秒运行一次,添加任意数量的触发器):

<trigger>
  <simple>
    <name>sqlTrigger1</name>
    <job-name>genericSqlJob</job-name>
    <job-group>sqlJobs</job-group>
    <job-data-map>
      <entry>
        <key>sql_to_run</key>
        <value>select 1</value>
      </entry>
    </job-data-map>
    <misfire-instruction>SmartPolicy</misfire-instruction>
    <repeat-count>-1</repeat-count>
    <repeat-interval>10000</repeat-interval>
  </simple>
</trigger>

只需使用quartz_jobs.xml作为基础并进行必要的更改。

在作业中使用配置

您可以从包含作业和触发器参数的上下文MergedJobDataMap访问作业中的配置,后者覆盖前者。

public void Execute(IJobExecutionContext context)
{
    string sqlToRun = context.MergedJobDataMap.GetString("sql_to_run");
    SqlTemplate.ExecuteSql(sqlToRun);
}