本文作者:小黑黑

[Quartz.Net]Quartz.Net - 动态设置Job和Trigger

小黑黑 1年前 ( 2019-03-14 ) 1197 抢沙发
 [Quartz.Net]Quartz.Net - 动态设置Job和Trigger摘要:         我们在前面已经知道了怎样创建一个定时任务,通过JobBuilder和Trigger来...

        我们在前面已经知道了怎样创建一个定时任务,通过JobBuilder和Trigger来创建一个IJobDetail和ISimperTrigger,这当然是没有问题的,但使用这种方式如果我们的需求发生了改变,比如:我们以前有个任务需要每分钟触发一次,现在需求需要5分钟触发一次,那么我们不得不去修改源代码,然后重新编译发布,仅仅是触发条件的变化我们就去修改我们的源代码,这是我们非常不能忍受的,如果触发时间变动的比较频繁,那我们就很头疼,有没有一种方式可以使我们不去修改源代码而动态地去改变触发时间呢?当然是有的。

        在.Net Core中使用最新版的Quartz.Net时,我并没有发现Quartz.Net的Xsd文件,无奈之下在Quartz.Net的源代码中复制了一份(我不知道在什么地方获取。。。。),Xsd文件是什么东西呢,Xsd文件是指XML结构定义,用来我们写XML文件时智能提示使用的。

一、我们先创建一个quartz_jobs.xml的文件

二、将Xsd文件添加到架构中

123.png

在弹出来的界面中我们点击添加按钮,将我们的Xsd文件添加到架构中就可以了,添加之后,我们在写Xml文件时,就可以使用智能提示了。来看看我们写好的Xml配置文件吧:

<?xml version="1.0" encoding="utf-8" ?>
<job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 				version="2.0">
  <processing-directives>
    <overwrite-existing-data>true</overwrite-existing-data>
  </processing-directives>
  <schedule>
	<job>
      <name>myJob</name>         <!--相当于WithIdentity()中的name-->
      <group>jobGroup</group>    <!--相当于WithIdentity()中的group-->
      <description>我的第一个Job</description>  <!--Job的描述信息-->
      <job-type>DynamicConfigurationJobAndTrigger.Jobs.PrintHelloQuartz, 
                DynamicConfigurationJobAndTrigger</job-type>   <!--具体的Job类-->
      <durable>true</durable>    <!--是否持久化-->
      <recover>true</recover>    <!--是否故障恢复-->
      <job-data-map>             <!--JobDataMap-->
        <entry>                  
          <key>name</key>
          <value>张三</value>
        </entry>
      </job-data-map>
    </job>
    <trigger>
      <simple>                                          <!--SimpleTrigger-->
        <name>myTrigger</name>                          <!--相当于WithIdentity()中的name-->
        <group>triggerGroup</group>                     <!--相当于WithIdentity()中的group-->
        <description>我的第一个Trigger</description>    <!--Trigger的描述信息-->
        <job-name>myJob</job-name>                      <!--相关联的Job的name-->
        <job-group>jobGroup</job-group>                 <!--相关联的Job的group-->
        <repeat-count>-1</repeat-count>                 <!--重复次数,如果为-1,则相当于RepeatForever()-->
        <repeat-interval>1000</repeat-interval>         <!--触发间隔时间-->
      </simple>
    </trigger>
  </schedule>
</job-scheduling-data>

我们的xml文件写好后,初始化我们的Scheduler时需要配置一些信息,我们使用NameValueCollection的方式来配置,当然你也可以使用另外3种方式来进行配置,参考地址

public static async Task Init()
{
    NameValueCollection nameValueCollection = new NameValueCollection()
    {
        { "quartz.scheduler.instanceName", "MyScheduler"},    //设置Scheduler实例的名称
        { "quartz.threadPool.threadCount", "5"},              //设置线程数
        { "quartz.plugin.xml.type", "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins"},   //设置xml处理程序插件
        { "quartz.plugin.xml.fileNames", "~/quartz_jobs.xml" },   //设置xml配置文档地址
        { "quartz.plugin.xml.scanInterval", "2"}            //定期扫描quartz_jobs.xml
    };

    ISchedulerFactory schedulerFactory = new StdSchedulerFactory(nameValueCollection);
    IScheduler scheduler = await schedulerFactory.GetScheduler();

    await scheduler.Start();
}


public class PrintHelloQuartz : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        await Console.Out.WriteLineAsync($"Hello Quartz.Net,执行时间:{DateTime.Now.ToString("mm:ss")}");
    }
}

123.png

我们发现程序可以正常运行,如果哪天我们的需求发生了改变,比如我们现在需要3秒触发一次,那么我们只需要将quartz_jobs.xml中的repeat-interval设置为3000即可,不需要重启程序,因为我们在初始化scheduler时设置了每2秒扫描一次quartz_job.xml,如果内容发生了改变,那么我们的程序也会按照配置来正常运行。

分享到: 网站分享代码

发表评论

快捷回复:

评论列表 (暂无评论,1197人围观)参与讨论

还没有评论,来说两句吧...