Quartz.Net使用

Stella981
• 阅读 670

Quartz.Net使用

标签:Quartz.Net


在最近工作中,需要在不同时间及不同条件下定时发送通知及消息,最初使用 System.Timers.Timer实现。虽然使用简单,随着需要定时处理的任务增多,考虑到 System.Timers.Timer如下缺点:

  • Timer没有持久化机制;
  • Timer的调度没有弹性,仅能定时触发,不可自由配置触发时间点;
  • Timer不能利用线程池,每一个Timer需要开启一个线程;
  • 每个Timer中的任务为串行执行,同一时间只能有一个任务在执行。前一个任务执行失败影响后面任务的执行;

Quartz.Net的以下优点可解决以上问题

  • 使用灵活,有多种使用方式(eg XML配置任务,及代码实现),且可以混合使用;
  • 支持集群,作业分组,及作业远程管理;
  • 可自定义精细的时间管理;
  • 支持数据库,可持久化。

安装

  • 通过NuGet安装Quartz.Net

说明

  • 每一个任务需要继承接口IJob,并实现Execute(IJobExecutionContext context),该方法为每个Job需要做的具体处理;

代码示例

  • 代码创建job示例
  private static void Main(string[] args)
        {
            try
            {
                WatchFile();
                var fileName = Path.Combine(Environment.CurrentDirectory, "log4config.config");
                XmlConfigurator.ConfigureAndWatch(new FileInfo(fileName));
                StdSchedulerFactory factory = new StdSchedulerFactory();
                IScheduler scheduler = factory.GetScheduler();
                // 启动任务
                scheduler.Start();
                // 创建Job,可通过JobDataMap传递数据
                IJobDetail job = JobBuilder.Create<HelloJob>()
                    .WithIdentity("job1", "group1")
                    .UsingJobData("jobSays", "Hello World!")
                    .UsingJobData("myFloatValue", 3.141f)
                    .Build();
                //创建trigger
                ITrigger trigger = TriggerBuilder.Create()
                    .WithIdentity("trigger1", "group1")
                    .StartNow()
                    .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).RepeatForever())
                    .Build();
                //把job,trigger加入调度器
                scheduler.ScheduleJob(job, trigger);
                //关闭调度器
                scheduler.Shutdown();
            }
            catch (Exception ex)
            {
                LogHelper.Error("Main" + ex);
            }
            Console.WriteLine("Press any key to close the application");
            Console.ReadKey();
        }
    public class HelloJob : IJob
    {
        public void  Execute(IJobExecutionContext context)
        {
            JobKey key = context.JobDetail.Key;
            //获取执行的数据
            JobDataMap dataMap = context.JobDetail.JobDataMap;
            string jobSays = dataMap.GetString("jobSays");
            float myFloatValue = dataMap.GetFloat("myFloatValue");
             Console.Error.WriteLineAsync("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);

        }
    }
    pub    
  • XML方式配置Job、Trigger代码示例 1) 在quartz_jobs.xml为配置JobTrigger的文件 配置文件示例:
<?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>CommonIMRemindJob</name>
      <group>IMRemindJob</group>
      <description>IMRemindJob</description>
      <job-type>NXIN.Qlw.JobServices.CommonIMRemindJobService,NXIN.Qlw.JobServices</job-type>
      <durable>true</durable>
      <recover>true</recover>
    </job>
    <trigger>
      <simple>
        <name>CommonIMRemindTrigger</name>
        <group>IMRemindJob</group>
        <description>CommonIMRemindTrigger</description>
        <job-name>CommonIMRemindJob</job-name>
        <job-group>IMRemindJob</job-group>
        <misfire-instruction>SmartPolicy</misfire-instruction>
        <repeat-count>-1</repeat-count>
        <repeat-interval>300000</repeat-interval>
      </simple>
    </trigger>
  </schedule>
</job-scheduling-data>


2)实现示例


  private static void InitScheduler()
        {
            try
            {
                NameValueCollection props = new NameValueCollection
                {
                    { "quartz.serializer", "binary" }
                };

                XMLSchedulingDataProcessor processor = new XMLSchedulingDataProcessor(new SimpleTypeLoadHelper());

                StdSchedulerFactory factory = new StdSchedulerFactory(props);
                IScheduler scheduler = factory.GetScheduler();
                processor.ProcessFileAndScheduleJobs("~/quartz_jobs.xml", scheduler);
                scheduler.Start();
            }
            catch (SchedulerException se)
            {
                LogHelper.Error("/Main/RunProgramRunExample" + se);
            }
        }

参考博客:[蘑菇先生Net作业调度系列][1] [1]: http://www.cnblogs.com/mushroom/p/4850115.html

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这