第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借助TopSelf、服务类】)

一. IIS部署

  比如在MVC框架中集成了Quartz.Net定时调度,此时该调度系统会随着MVC框架被挂在IIS下,IIS会进程回收,所以大部分开发都会遇到Quartz挂在IIS下一段时间不好用。

  补充:IIS可以设置定时自动回收,默认回收是1740分钟,也就是29小时。IIS自动回收相当于服务器IIS重启,应用程序池内存清空,所有数据被清除,相当于IIS重启,在度量快速开发平台服务器端,为了减小数据库负担,内存中暂存了很多信息,不适合频繁的回收,因为回收会造成服务器端所有存在内存中的数据丢失,如果没有及时保存到数据库中,可能导致程序出现问题。而如果系统使用高峰时期,并不适合回收,回收可能导致几十秒IIS无响应,对于正在工作的人员来说,是一种很不好的体验,会以为是网络或者掉线等问题。

  解决方案:关闭该项目在IIS上对应的进程池的回收机制。

  如何关闭进程池的回收机制:选中IIS中部署的项目对应的进程池,点击【高级设置】,里面有5个核心参数:

    ① 发生配置更改时禁止回收:如果为True,应用程序池在发生配置更改时将不会回收。

    ② 固定时间间隔(分钟):超过设置的时间后,应用程序池回收,设置为:0 意味着应用程序池不回收。系统默认设置的时间是1740(29小时)。

    ③ 禁用重叠回收:如果为true,将发生应用程序池回收,以便在创建另一个工作进程之前退出现有工作进程

    ④ 请求限制:应用程序池在回收之前可以处理的最大请求数。如果值为0,则表示应用程序池可以处理的请求数没有限制。

    ⑤ 生成回收事件日志条目:每发生一次指定的回收事件时便产生一个事件日志条目。

    总结:即使可以将IIS进程池回收关掉,仍然不建议把Quartz挂到IIS下,长时间不回收,会存在内存溢出的问题。

 

二. C/S程序直接运行

  我们可以用控制台的形式或者Winform的形式单独做一套定时调度系统,与主框架分类,也便于维护,可以直接将exe程序或者Winform窗体程序在服务器上运行。

  总结:该方法不存在回收的问题,但直接在服务器上运行,容易不小心被运维人员关掉了。

  对于专业一点的人员来说,该方案,直接运行程序太Low了,所以通常是将exe程序发不成windows服务,通过服务的开启和关闭来 维护。

 

三. 借助topshelf来进行的windows服务部署 

  官网:http://topshelf-project.com/ , 这是一种通用的发布服务的方式,步骤如下:

  1. 通过NuGet下载 Topshelf 的程序集

  2. 配置QuartzService类,充当定时任务的服务端程序

    ①:构造函数中执行定时调度任务

    ②:Start()方法控制调度的开启 (必填)

    ③:Stop()方法控制调度的关闭 (必填)

    ④:Pause()方法暂停调度 (选填)

    ⑤:Continue()方法继续调度 (选填)

    ⑥:Shutdown() 关闭 (需要支持)

  3. 在主程序中通过topshelf代码调用: HostFactory.Run 详见主程序。(在里面可以设置服务的名称、描述等

  4. 通过指令进行服务发布和卸载(查看windows服务:services.msc)

   ①:通过cmd命令定位到bin文件目录下(以管理员身份运行)

    (eg: 先输入 d: 切换到D盘,再执行下面的命令  cd D:\06-我的开发之路\DotNet体系\04-DotNet专题篇\01-Quartz.Net定时调度\01-Code\MyQuarzt\QuartzDemo\bin\Debug  )

   ②:QuartzDemo.exe help: 查看指令

     QuartzDemo.exe install: 安装服务

     QuartzDemo.exe install start : 安装服务且开启

     QuartzDemo.exe uninstall :卸载服务

  截止此处,大功告成,可以看到D盘中多了一个txt文件,每隔3s多一条数据

 下面分享整个过程的代码部署的相应截图:

 (1). Quartz代码和TopSelf调用代码:

复制代码

 1    public class QuartzService2     {3         IScheduler scheduler = null;4         /// <summary>5         /// 定时调度业务6         /// </summary>7         public QuartzService()8         {9             //1.创建作业调度池(Scheduler)
10             scheduler = StdSchedulerFactory.GetDefaultScheduler();
11 
12             //2.创建一个具体的作业即job (具体的job需要单独在一个文件中执行)
13             var job = JobBuilder.Create<HelloJob5>().Build();
14 
15             //3.创建并配置一个触发器即trigger   3s执行一次
16             var trigger = TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(3)
17                                                                            .RepeatForever()).Build();
18             //4.将job和trigger加入到作业调度池中
19             scheduler.ScheduleJob(job, trigger);
20         }
21         /// <summary>
22         /// 开启任务
23         /// </summary>
24         public void Start()
25         {
26             scheduler.Start();
27         }
28         /// <summary>
29         /// 关闭任务
30         /// </summary>
31         public void Stop()
32         {
33             //true:表示该Sheduler关闭之前需要等现在所有正在运行的工作完成才能关闭
34             //false:表示直接关闭
35             scheduler.Shutdown(true);
36         }
37         /// <summary>
38         /// 暂停调度
39         /// </summary>
40         public void Pause()
41         {
42             scheduler.PauseAll();
43         }
44         /// <summary>
45         /// 继续调度
46         /// </summary>
47         public void Continue()
48         {
49             scheduler.ResumeAll();
50         }
51 
52     }

复制代码

复制代码

 1             HostFactory.Run(x =>                                 //12                     {3                         x.Service<QuartzService>(s =>                        //24                         {5                             s.ConstructUsing(name => new QuartzService());     //36                             //开启和关闭  必选项7                             s.WhenStarted(tc => tc.Start());              //48                             s.WhenStopped(tc => tc.Stop());               //59 
10                             // optional pause/continue methods if used  
11                             // 暂停和继续  选填
12                             s.WhenPaused(tc => tc.Pause());
13                             s.WhenContinued(tc => tc.Continue());
14 
15                              optional, when shutdown is supported
16                             //s.WhenShutdown(tc => tc.Shutdown());
17 
18                         });
19                         x.RunAsLocalSystem();                            //6
20                         x.SetDescription("测试借助TopSelf将Quartz发布成服务");        //7
21                         x.SetDisplayName("QuartzService");                       //8
22                         x.SetServiceName("QuartzService2");                       //9
23                     });

复制代码

(2). 定位到指定路径,并进行相应的服务部署

a. 很多指令

b. 安装服务并开启

 

查看服务列表:

 

查看服务运行结果:

 

删除服务:

 

 

三. 借助window服务类

   这里不详细介绍(网上一堆一堆的),推荐采用上面的TopShelf的服务发布方式。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[你必须知道的.NET] 第二回:对抽象编程:接口和抽象类

本文将介绍以下内容&#xff1a; • 面向对象思想&#xff1a;多态 • 接口 • 抽象类 1. 引言 在我之前的一篇post《抽象类和接口的谁是谁非》中&#xff0c;和同事管伟的讨论&#xff0c;得到很多朋友的关注&#xff0c;因为是不成体系的论道&#xff0c;所以给大家了解造…

Linux 启动失败 磁盘阵列,组建RAID5重启系统,出现md127的解决办法

我这里在组建RAID5之后重启了系统&#xff0c;当时/dev/md0变成了/dev/md127。出现这问题主要是我没有配置生成/etc/mdadm.conf文件&#xff0c;如果哪位伙伴出现类似我这种情况&#xff0c;而不是通过我这种方法解决的&#xff0c;希望能分享一下你的解决方法&#xff0c;谢谢…

[你必须知道的.NET] 第三回:历史纠葛:特性和属性

本文将介绍以下内容&#xff1a; • 定制特性的基本概念和用法 • 属性与特性的区别比较 • 反射的简单介绍 1. 引言 attribute是.NET框架引入的有一技术亮点&#xff0c;因此我们有必要花点时间来了解本文的内容&#xff0c;走进一个发现attribute登堂入室的入口。因为.N…

Linux的性能故障的含义,Linux排查性能故障的方法

好了&#xff0c;鉴于我们的Linux发行版现已安装&#xff0c;许多方面看起来似乎根本不“好”。今天我们将介绍为安装的Linux排查性能故障的方法。虽然今天的这篇文章明显倾向于Ubuntu&#xff0c;但我们探讨的几乎一切内容都同样适用于每个Linux发行版。要是哪些命令是专门针对…

[你必须知道的.NET] 第四回:后来居上:class和struct

本文将介绍以下内容&#xff1a; • 面向对象基本概念 • 类和结构体简介 • 引用类型和值类型区别 1. 引言 提起class和struct&#xff0c;我们首先的感觉是语法几乎相同&#xff0c;待遇却翻天复地。历史将接力棒由面向过程编程传到面向对象编程&#xff0c;class和stru…

linux shell跳板机,用shell开发跳板机

信号列表&#xff1a;在linux中和信号相关的常见命令为kill及trap命令&#xff0c;下来如何利用trap控制跳板机脚本来使用命令&#xff1a;命令&#xff1a;kill -l 和 trap -l企业实战中linux系统的重要信号及说明HUP(1) 挂起INT(2) 中断OUIT(3) 退…

[你必须知道的.NET] 第五回:深入浅出关键字---把new说透

本文将介绍以下内容&#xff1a; 面向对象基本概念new关键字深入浅出对象创建的内存管理 1. 引言 园子里好像没有或者很少把new关键字拿出来说的&#xff0c;那我就占个先机吧&#xff0c;呵呵。那么&#xff0c;我们到底有必要将一个关键字拿出来长篇大论吗&#xff1f;看来…

linux tcp server开源,GitHub - 06linux/cellnet: 高性能,简单,方便的开源服务器网络库...

cellnetcellnet是一个高性能&#xff0c;简单&#xff0c;方便的开源服务器网络库自由混合编码&#xff0c;业务代码无需调整。TCP和html5的应用都可以直接使用cellnet迅速搭建服务器框架。与Java的Netty或Mina网络库类似的Handler机制将给予强大定制功能。特性数据协议支持混合…

[你必须知道的.NET] 第六回:深入浅出关键字---base和this

本文将介绍以下内容&#xff1a; 面向对象基本概念base关键字深入浅出this关键字深入浅出1. 引言 new关键字引起了大家的不少关注&#xff0c;尤其感谢Anders Liu的补充&#xff0c;让我感觉博客园赋予的交流平台真的无所不在。所以&#xff0c;我们就有必要继续这个话题&…

[你必须知道的.NET] 第七回:品味类型---从通用类型系统开始

本文将介绍以下内容&#xff1a; .NET 基础架构概念 类型基础通用类型系统CLI、CTS、CLS的关系简述1. 引言 本文不是连环画&#xff0c;之所以在开篇以图形的形式来展示本文主题&#xff0c;其实就是想更加特别的强调这几个概念的重要性和关注度&#xff0c;同时希望从剖析其关…

[你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理

本文将介绍以下内容&#xff1a; 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用1. 引言 买了新本本&#xff0c;忙了好几天系统&#xff0c;终于开始了对值类型和引用类型做个全面的讲述了&#xff0c;本系列开篇之时就是因为想写这个主题&#xff0c;…

[你必须知道的.NET]第九回:品味类型---值类型与引用类型(中)-规则无边

接上回[第八回&#xff1a;品味类型---值类型与引用类型&#xff08;上&#xff09;&#xff0d;内存有理]的探讨&#xff0c;继续我们关注值类型和引用类型的话题。 本文将介绍以下内容&#xff1a; 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用1. 引…

[你必须知道的.NET]第十回:品味类型---值类型与引用类型(下)-应用征途

本文将介绍以下内容&#xff1a; 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用 [下载]&#xff1a;[类型示例代码] 1. 引言 值类型与引用类型的话题经过了两个回合&#xff08;[第八回&#xff1a;品味类型---值类型与引用类型&#xff08;上&#xf…

[你必须知道的.NET]第十一回:参数之惑---传递的艺术(上)

本文将介绍以下内容&#xff1a; 按值传递与按引用传递深论ref和out比较 参数应用浅析 1. 引言 接上回《第九回&#xff1a;品味类型---值类型与引用类型&#xff08;中&#xff09;&#xff0d;规则无边》中&#xff0c;对值类型和引用类型的讨论&#xff0c;其中关于string…

[你必须知道的.NET]第十二回:参数之惑---传递的艺术(下)

本文将介绍以下内容&#xff1a; 按值传递与按引用传递深论ref和out比较 参数应用浅析 接上篇继续&#xff0c;『第十一回&#xff1a;参数之惑---传递的艺术&#xff08;上&#xff09;』 4.2 引用类型参数的按值传递 当传递的参数为引用类型时&#xff0c;传递和操作的是指…

[你必须知道的.NET]第十三回:从Hello, world开始认识IL

本文将介绍以下内容&#xff1a; IL代码分析方法 Hello, world历史 .NET学习方法论1. 引言 1988年Brian W. Kernighan和Dennis M. Ritchie合著了软件史上的经典巨著《The C programming Language》&#xff0c;我推荐所有的程序人都有机会重温这本历史上的经典之作。从那时起…

[你必须知道的.NET]第十四回:认识IL代码---从开始到现在

本文将介绍以下内容&#xff1a; IL代码分析方法 IL命令解析 .NET学习方法论 1. 引言 自从『你必须知道.NET』系列开篇以来&#xff0c;受到大家很多的关注和支持&#xff0c;给予了anytao巨大的鼓励和动力。俱往昔&#xff0c;我发现很多的园友都把…

[你必须知道的.NET]第十五回:继承本质论

本文将介绍以下内容&#xff1a; 什么是继承&#xff1f;继承的实现本质1. 引言 关于继承&#xff0c;你是否驾熟就轻&#xff0c;关于继承&#xff0c;你是否了如指掌。 本文不讨论继承的基本概念&#xff0c;我们回归本质&#xff0c;从编译器运行的角度来揭示.NET继承中的…

海岸鸿蒙2018年标准物质,海岸鸿蒙——20年权威的标准物质研制单位

摘要&#xff1a;海岸鸿蒙创办于1996年&#xff0c;是专业从事国家标准物质研发、生产、销售的高新技术企业。海岸鸿蒙创办于1996年&#xff0c;是专业从事国家标准物质研发、生产、销售的高新技术企业。海岸鸿蒙自创办以来&#xff0c;一直秉持“以市场为导向&#xff0c;以科…

[你必须知道的.NET]第十六回:深入浅出关键字---using全接触

本文将介绍以下内容&#xff1a; using指令的多种用法using语句在Dispose模式中的应用1. 引言 在.NET大家庭中&#xff0c;有不少的关键字承担了多种角色&#xff0c;例如new关键字就身兼数职&#xff0c;除了能够创建对象&#xff0c;在继承体系中隐藏基类成员&#xff0c;还在…