1

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

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

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

Quartz 怎么知道要拾取更改的触发器,例如为其中一个 SP 拾取?这是否必须是 Win Svc 上的启动/停止循环才能重新加载作业和触发器,还是我也必须手动编写某种“重新加载”代码?

有什么想法吗?我误解了石英是什么吗?措辞使它听起来像是一个企业调度程序,一个系统,一个你安装的东西。OTOH 的所有文档使它看起来只是一堆类,您可以将它们拼接在一起以创建您的 OWN 调度程序或调度系统,这与 MS 在 .NET 中提供的用于创建执行 FTP 的应用程序的类没有什么不同。可能是我期待太多了?

4

1 回答 1

3

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

从示例服务器开始

以 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);
}
于 2013-03-12T11:47:28.810 回答