架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 285|回复: 6

[框架] 开源作业调度框架Quartz

[复制链接]
跳转到指定楼层
楼主
发表于 2019-5-18 16:51:41
zu
本帖最后由 空蝉如此世 于 2019-5-18 16:53 编辑

前言



在上篇里提到定时执行任务,用Topshelf配合Quartz.Net 使用,会很方便。本篇将会记录Quartz.Net 的使用方法。



工具

>VS 2017




正文

Quartz这个开源框架一般是配合定时服务一起使用的。在上一篇Topshelf的基础上,代码只要稍加修改就可以了。


1:新建控制台应用程序。


2:引入Topshelf 和 Quartz dll(搭配Common.Logging.Core.dll 一起使用)





3:新建两个类,类名分别是 :ServiceRunner.cs  和 TestJob.cs


4:在Program Main 函数中 贴入Topshelf 代码。


  1. using System;
  2. using Topshelf;

  3. namespace Topshelf_Quartz
  4. {
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             var rc = HostFactory.Run(x =>
  10.             {
  11.                 x.Service<ServiceRunner>(s =>
  12.                 {
  13.                     s.ConstructUsing(name => new ServiceRunner());
  14.                     s.WhenStarted(tc => tc.Start());
  15.                     s.WhenStopped(tc => tc.Stop());
  16.                 });
  17.                 x.RunAsLocalSystem();

  18.                 x.SetDescription("Sample Topshelf Host");
  19.                 x.SetDisplayName("Stuff");
  20.                 x.SetServiceName("Stuff");
  21.             });

  22.             var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());
  23.             Environment.ExitCode = exitCode;
  24.             Console.ReadKey();
  25.         }
  26.     }
  27. }
复制代码



5:在ServiceRunner.cs 中贴入

  1. using Quartz;
  2. using Quartz.Impl;
  3. using System;

  4. namespace Topshelf_Quartz
  5. {
  6.     class ServiceRunner
  7.     {
  8.         //调度器。
  9.         private readonly IScheduler _scheduler;
  10.         public ServiceRunner()
  11.         {
  12.             StdSchedulerFactory factory = new StdSchedulerFactory();
  13.             this._scheduler = factory.GetScheduler();
  14.             InitializeJob();
  15.         }
  16.         private void InitializeJob()
  17.         {
  18.             IJobDetail job = JobBuilder.Create<TestJob>()  //创建一个作业
  19.                .WithIdentity("更新任务数据", "作业组")
  20.                .Build();
  21.             ITrigger trigger = TriggerBuilder.Create()
  22.                                        .WithIdentity("触发器名称", "触发器组")
  23.                                        .WithSimpleSchedule(x => x         //触发时间,*秒一次。
  24.                                            .WithIntervalInSeconds(3)
  25.                                            .RepeatForever())              //不间断重复执行
  26.                                        .ForJob("更新任务数据", "作业组")
  27.                                        .Build();
  28.             _scheduler.ScheduleJob(job, trigger);
  29.         }
  30.         public void Start()
  31.         {
  32.             this._scheduler.Start();//启动quartz服务
  33.             Console.WriteLine("服务启动");
  34.         }
  35.         public void Stop()
  36.         {
  37.             this._scheduler.Shutdown(false);//true:等待正在运行的计划任务执行完毕;false:强制关闭
  38.             Console.WriteLine("服务停止");
  39.         }

  40.     }
  41. }
复制代码

在上面代码中,实现的是,每隔多少秒触发一次。也可以实现固定的时间去触发。比如:每天6点执行。每周一10点执行等等。 可参考 Quartz  Cron 表达式。

写法也有相应的修改

  1. ITrigger trigger = TriggerBuilder.Create()
  2.                                        .WithIdentity("触发器名称", "触发器组")
  3.                                        .WithCronSchedule("0 15 10 * * ?")
  4.                                        .ForJob("更新任务数据", "作业组")          //每天10点15分执行
  5.                                        .Build();
复制代码



6:在TestJob.cs中贴入


  1. using Quartz;
  2. using System;

  3. namespace Topshelf_Quartz
  4. {
  5.     class TestJob : IJob
  6.     {
  7.         public void Execute(IJobExecutionContext context)
  8.         {
  9.             Console.WriteLine("It is {0} and all is well", DateTime.Now);  //do something
  10.         }
  11.     }
  12. }
复制代码


7:F5启动,就能看到每隔三秒输出一行数据。

8:调试好之后,就可以按照上篇的方法 安装服务了。也可以直接写个批处理文件,只要运行就可以了。不用敲命令行

安装服务:
新建一个记事本:重命名并更改后缀名 :Install.bat
右击记事本打开,并贴入以下命令,保存。
  1. @echo on
  2. color 2f
  3. mode con: cols=80 lines=25
  4. @echo 请按任意键开始安装后台服务...
  5. pause
  6. cd /d %~dp0
  7. Topshelf+Quartz.exe install
  8. pause
复制代码

卸载服务:
新建一个记事本:重命名并更改后缀名 :Uninstall.bat
右击记事本打开,并贴入以下命令,保存。

  1. @echo on
  2. color 2f
  3. mode con: cols=80 lines=25
  4. @echo 请按任意键开始卸载后台服务...
  5. pause
  6. cd /d %~dp0
  7. Topshelf+Quartz.exe uninstall
  8. pause
复制代码


注意:
  >安装后,要启动服务,才会运行。
  >安装和卸载服务都要使用管理员权限。
  >修改配置文件后,需要重启服务才会生效。


尾声

  本文只贴代码和简单的使用。具体理论资料可参考  Quartz 官方文档。









上一篇:关于BIO和NIO的理解
下一篇:请教 java 操作 rabbitmq ,basicQos() 无效问题
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
沙发
发表于 2019-5-18 17:02:47 来自手机
棒棒哒
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
板凳
发表于 2019-5-20 09:30:40
怎么动态添加删除计划任务呢?
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
地板
发表于 2019-5-20 09:37:17
学习学习
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
回复

使用道具 举报

5#
发表于 2019-5-20 09:44:44
很棒,之前写了一个实时监测的服务,这个定时启动服务以后说不定用得着
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
6#
发表于 2019-5-21 13:36:57
空蝉大佬牛逼
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
7#
 楼主| 发表于 2019-5-26 13:18:04
小渣渣 发表于 2019-5-20 09:30
怎么动态添加删除计划任务呢?

可以建一个 泛型任务类。继承IJob 接口。调用传参就好了。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2019-7-20 20:15

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表