在阅读了所有教程之后,仍然试图围绕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的例子没有什么不同。也许我期待太多了?
答案 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);
}