Quartz.Net 配置(转载)

Quartz.Net 有两类配置文件,

1. Quartz.系统级别配置,  默认配置文件名为 quartz.config , 是java properties 格式的配置文件, 用来设定 quartz 整体行为, 比如 scheduler instance id, 线程池大小, jobstore类型, DB jobstore的数据库地址, quartz 的插件(比如有长时间作业自动 interrupt 插件), 以及定义 job/trigger的配置文件路径

2. job/trigger的配置文件, 默认名称为 quartz_jobs.xml, 用来配置 job 和 trigger 定义信息

 

对于Quartz.系统级的配置,  可以直接用代码设置,  可以放到quartz.config,  也可以 Quartz.Net 也支持定义在 C#项目的 app.config 文件中, 这样就不需要单独再引入 quartz.config 文件.

 

下面是写代码的方式设定Quartz.系统级配置的示例:

               var factory = new StdSchedulerFactory(new System.Collections.Specialized.NameValueCollection()
                {
                    {"quartz.plugin.xml.fileNames","~/quartz_jobs.xml" },
                    {"quartz.plugin.xml.type","Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin,Quartz"},
                    {"quartz.plugin.triggHistory.type","Quartz.Plugin.History.LoggingJobHistoryPlugin,Quartz"}, 
                });
            IScheduler scheduler = factory.GetScheduler();
            scheduler.Start();

 

定义在 C#项目 app.config 的示例:

<quartz>
        <add key="quartz.scheduler.instanceName" value="QuartzScheduler" />
        <!-- Configure Thread Pool -->
        <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
        <add key="quartz.threadPool.threadCount" value="10" />
        <add key="quartz.threadPool.threadPriority" value="Normal" />
        <!-- Configure Job Store -->
        <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />
        <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.plugin.xml.scanInterval" value="10" />
        <add key="quartz.plugin.xml.failOnFileNotFound" value="true" /> 
 </quartz>
    
 

 注意:

1.   V2 版本的插件 quartz.plugin.xml  和 V3 版的quartz.plugin.jobInitializer 是一个东西,  v2 插件放在主包中, v3 分离到 Quartz.Plugins 包中了.

2.   quartz.plugin.xml.scanInterval 参数可以设置定时几秒自动加载job/trigger定义文件, 取值为0表示禁止自动加载job文件.

3.   xml 文件定义的job 只需要调用  scheduler.Start() 即可自动调度 ; 但使用代码build 的job, 需要额外调用 scheduler.ScheduleJob() 方法才能被调度.

4.  quartz.net Version 3之后开始支持异步, 我使用的是quart 2.6.2, 即v2的最后一个版本, 还是传统的代码写法.

5. 如果没有空余线程, job将会等到腾出空余线程才会执行, 但是等待时间如果超过 misfireThreshold 设置时间将放弃本次执行.

 

具体可以参考

https://stackoverflow.com/questions/10952240/quartz-net-job-type-configuration-issues

https://github.com/castleproject/Windsor.Quartz/blob/master/docs/configuration.md

https://jalena.bcsytv.com/archives/1994

https://www.cnblogs.com/skychen1218/p/7765823.html

 

 

下面部分转载自 https://jalena.bcsytv.com/archives/1994

Quartz.NET 3.x 例子

2018-03-25 435点热度 1人点赞 0条评论

最近写项目需要用到定时任务,所以就找到了Quartz.NET,但网上的例子都是到处抄袭的,完全没有适合Quartz.NET 3.x 的有用信息,这里就将自己的使用例子帖一下。

  • IDE:VS2017
  • .Net : 4.5.2

写在前面

Quartz.NET 在3.x已经将插件分离了,所以如果要从xml直接加载文件,需要引入插件包


配置

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="QuartzScheduler"/>
    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
    <add key="quartz.threadPool.threadCount" value="10"/>
    <!--******************************Plugin配置*********************************************-->
    <add key="quartz.plugin.jobInitializer.type" value="Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins"/>
    <add key="quartz.plugin.jobInitializer.fileNames" value="quartz_jobs.xml"/>
  </quartz>

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
  </startup>

</configuration>

 

 

quartz_jobs.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- This file contains job definitions in schema version 2.0 format -->

<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>jldwjob</name>
      <group>kelun</group>
      <description>计量单位</description>
      <job-type>Kelun.JldwJob, Kelun</job-type><!--格式:实现了IJob接口的包含完整命名空间的类名,程序集名称-->
      <durable>true</durable>
      <recover>false</recover>
    </job>
    
    <trigger>
      <cron>
        <name>jlwd</name>
        <group>kelun</group>
        <job-name>jldwjob</job-name>
        <job-group>kelun</job-group>
        <!--<start-time>2018-01-22T00:00:00+08:00</start-time>-->
        <cron-expression>0/1 * * * * ?</cron-expression><!--每3秒执行一次-->
      </cron>
    </trigger>

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

接口实现

using Kelun.Log4Net;
using Quartz;
using System.Reflection;
using System.Threading.Tasks;

namespace Kelun
{
    class JldwJob : IJob
    {

        private static readonly IMyLog Logger = MyLogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        public Task Execute(IJobExecutionContext context)
        {
            return Task.Run(() => 
            {
                Logger.Info("定时任务执行");
            });
        }
    }
}

启动Quartz

public MainForm()
{
    InitializeComponent();
    RunProgramAsync().GetAwaiter().GetResult();
}

private static async Task RunProgramAsync()
{
    try
    {
        StdSchedulerFactory factory = new StdSchedulerFactory();

        IScheduler scheduler = await factory.GetScheduler();

        //开启调度器
        await scheduler.Start();

        //创建一个作业
        //IJobDetail job = JobBuilder.Create<JldwJob>().WithIdentity("myJob", "group1").Build();

        //ITrigger trigger = TriggerBuilder.Create()
        //    .WithIdentity("myTrigger", "group1")
        //    .StartNow()     //现在开始
        //    .WithSimpleSchedule(x => x
        //        .WithIntervalInSeconds(1)   //触发时间,1秒一次
        //        .RepeatForever())
        //    .Build();

        //把作业,触发器加入调度器。
       //await scheduler.ScheduleJob(job, trigger);  

        //await scheduler.Shutdown();

    }
    catch (SchedulerException se)
    {
        Logger.Error("执行错误", se);
    }
}

 

 

禁用Quartz.NET日志输出

<logger name="Quartz">
    <level value="OFF" />
</logger>

 

 
posted @ 2021-01-30 00:18  harrychinese  阅读(820)  评论(0编辑  收藏  举报