Quartz.net通过配置文件建立job和trigger

        在上一篇文章当中,我简单的介绍了直接在代码中进行作业和触发器的建立,Quartz的强大之处在于其的配置文件,所以,这一篇博客主要讲怎么通过配置文件来建立作业和触发器。

        首先我们创建作业调度器和和启动调度器:

static void Main(string[] args)
{
    // 创建作业调度器
    ISchedulerFactory chedulerFactory = new StdSchedulerFactory();
    IScheduler scheduler = chedulerFactory.GetScheduler();
 
    // 启动调度器

    scheduler.Start();
}

接着创建作业:

public class NewJob : IJob
{
    
    public void Execute(IJobExecutionContext context)
    { 
        Console.WriteLine(DateTime.Now);
    }
}

        接下来就是我们的重头戏了,我们通过配置文件来进行Quartz的使用,我们需要建立一个quartz_jobs.xml的文件,千万记得要将该文件的属性选择为始终复制,如下:

<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>Job</name>
        <!--组名,随便取-->
      <group>group</group>
        <!--描述-->
      <description>job</description>
        <!--作业类,要定位到我们代码中创建的作业,命名空间.类名-->
      <job-type>QuartzTest.NewJob, QuartzTest</job-type>
      <durable>true</durable>
      <recover>false</recover>
      
    </job>

    <trigger>
        <!--简单的触发器-->
      <simple>
        <!--触发器名字,随便取-->
        <name>Trigger</name>
        <!--组名-->
        <group>group</group>
        <!--描述-->
        <description>trigger</description>
        <!--作业名,触发哪个作业-->
        <job-name>Job</job-name>
        <!--作业的组名,与作业对应-->
        <job-group>group</job-group>
        <misfire-instruction>SmartPolicy</misfire-instruction>
        <!--任务执行次数,-1为无限执行-->
        <repeat-count>-1</repeat-count>
        <!--每5000毫秒执行一次-->
        <repeat-interval>5000</repeat-interval>
      </simple>
    </trigger>

  
  </schedule>
</job-scheduling-data>

        光有这个文件还不行,我们还需要一个配置文件,也就是要让程序知道我们读取哪一个配置文件,有两种配置文件的写法,第一种是使用App.config进行:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
      <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />

  </configSections>
  <quartz>
    <add key="quartz.scheduler.instanceName" value="ServerScheduler" />

    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
    <add key="quartz.threadPool.threadCount" value="10" />
    <add key="quartz.threadPool.threadPriority" value="2" />

    <add key="quartz.plugin.xml.type" value = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" />
    <add key="quartz.plugin.xml.fileNames" value = "quartz_jobs.xml" />
    
    <add key="quartz.jobStore.misfireThreshold" value="60000" />
    <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
  </quartz>
</configuration>

        如果使用的是Quartz.net3.x版本的,得再单独引入Quartz.Plugin插件,然后记得修改为:

<add key="quartz.plugin.xml.type" value = "Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugin" />
<add key="quartz.plugin.xml.fileNames" value = "~/quartz_jobs.xml" />

        第二种是使用quartz.config,这里也记得千万选择始终复制,当然,会在根节点出现红色的波浪线,不用管它,完全没事


# You can configure your scheduler in either <quartz> configuration section
# or in quartz properties file
# Configuration section has precedence
quartz.scheduler.instanceName = ServerScheduler
# configure thread pool info
quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz
quartz.threadPool.threadCount = 10
quartz.threadPool.threadPriority = Normal
# job initialization plugin handles our xml reading, without it defaults are used
quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz
quartz.plugin.xml.fileNames = ~/quartz_jobs.xml
# export this server to remoting context
quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz
quartz.scheduler.exporter.port = 555
quartz.scheduler.exporter.bindName = QuartzScheduler
quartz.scheduler.exporter.channelType = tcp
quartz.scheduler.exporter.channelName = httpQuartz

        好了,现在就可以进行测试了,测试结果就是每五秒输出一下当前的事件时间。

        我们这里使用的是简单的触发器,那怎么使用cron表达式的触发器呢?需要修改配置文件quartz_jobs.xml,代码如下:

<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>Job</name>
        <!--组名,随便取-->
      <group>group</group>
        <!--描述-->
      <description>job</description>
        <!--作业类,要定位到我们代码中创建的作业,命名空间.类名-->
      <job-type>QuartzTest.NewJob, QuartzTest</job-type>
      <durable>true</durable>
      <recover>false</recover>
      
    </job>

    <trigger>
        <!--cron表达式触发器-->
      <cron>
        <!--触发器名字,随便取-->
        <name>Trigger</name>
        <!--组名-->
        <group>group</group>
        <!--描述-->
        <description>trigger</description>
        <!--作业名,触发哪个作业-->
        <job-name>Job</job-name>
        <!--作业的组名,与作业对应-->
        <job-group>group</job-group>
        <misfire-instruction>SmartPolicy</misfire-instruction>
        <cron-expression>0/5 * * * * ?</cron-expression>
      </cron>
    </trigger>

  
  </schedule>
</job-scheduling-data>

        整个框架从基础而言,用着十分清爽,且配合cron表达式用着也十分的强大,几乎能应对各种任务调度。

发布了165 篇原创文章 · 获赞 41 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_41061437/article/details/100538464
今日推荐