简单的.NET后台定时服务框架
这里只是一个简单的后台开发框架。说白了就是为了方便开发,就是单纯的想专注于开发业务逻辑,不想每次新建后台服务的时候花太多时间在项目结构,服务安装,调度处理上。
最简单的用法就是,把代码下下来后,直接用vs打开。参照task的例子去写逻辑就ok了。
框架本身实现了
1.服务安装
框架本身是使用Topshelf进行服务安装,可以设置名称和描述,安装后直接可以在,这些都可以直接配置在app.config中
2.任务控制
框架提供了一个基类:ServiceBase,基类里面实现了 任务休眠和调度
任务的控制都是通过:Config/ServicesConfig.json配置文件管理
代码下载下来后的结构如下:
下面将使用框架创建一个每隔一分钟ping一次baidu.com的任务
1.在Services项目的Tasks文件夹中新建一个类 PingTask 继承于ServiceBase
2.PingTask实现Exec方法,在方法中实现ping逻辑 代码如下
using Services.Common; namespace Services.Tasks { class PingTask : ServiceBase { protected override void Exec() { ExecCmd("ping baidu.com"); } private void ExecCmd(string cmd) { System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动 p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息 p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息 p.StartInfo.RedirectStandardError = true;//重定向标准错误输出 p.StartInfo.CreateNoWindow = true;//不显示程序窗口 p.Start();//启动程序 //向cmd窗口发送输入信息 p.StandardInput.WriteLine(cmd+"&exit"); p.StandardInput.AutoFlush = true; //获取cmd窗口的输出信息 string output = p.StandardOutput.ReadToEnd(); p.WaitForExit();//等待程序执行完退出进程 p.Close(); LogFactory.GetLogger().Info(string.Format("执行命令:{0}; 执行结果:{1}", cmd, "")); } } }
3.在Config/ServicesConfig.json中添加配置节点
[ { //每隔一分钟ping一次baidu.com "ServiceName": "ping baidu.com任务", "Assembly": "Services.exe", "Methods": "Services.Tasks.PingTask", "S_Interval": 60 //间隔时间 单位秒 } ]
4.在App.config修改服务名称和描述
<appSettings> <add key="ServiceName" value="PingService" /> <add key="Description" value="每隔一分钟ping一次baidu.com" /> <add key="DisplayName" value="PingService" /> </appSettings>
5.服务安装(注意要在 Release下生成的才会创建服务 在 Program 可以修改)
a.修改Install.bat和UnInstall.bat 确保里面的服务名称和App.config中的ServiceName一致
b.运行Install.bat
c.打开服务管理器(win+R 输入 services.msc) 可以看到服务正在运行
一个最基础的服务就完成了,如果想在这个基础上开启多个ping服务,分别ping不同的地址
首先,修改PingTask代码 中的 ExecCmd("ping baidu.com"); 改为 ExecCmd(Config.Param);
代码如下
protected override void Exec() { ExecCmd(Config.Param); }
修改 Config/ServicesConfig.json 节点 下面是同时ping baidu.com 和 qq.com 的2个任务
[ { //每隔一分钟ping一次baidu.com "ServiceName": "ping baidu.com任务", "Assembly": "Services.exe", "Methods": "Services.Tasks.PingTask", "S_Interval": 60, //间隔时间 单位秒 "Param": "ping baidu.com" //自定义参数 }, { //每隔一分钟ping一次qq.com "ServiceName": "ping baidu.com任务", "Assembly": "Services.exe", "Methods": "Services.Tasks.PingTask", "S_Interval": 60, //间隔时间 单位秒 "Param": "ping qq.com" //自定义参数 } ]
这里主要是利用Param参数进行传递需要执行的命令;
然后重启服务即可。
任务调度支持多种方式
0.按指定间隔时间执行
1.每天指定时间执行 每天一次
2.指定时间执行一次
3.每天指定开始和结束时间并且按照指定间隔时间执行
完整的配置参数
[ { //全量配置 每天的 04点到06点执行,每次执行间隔60秒 "ServiceName": "ping baidu.com任务", //非空服务名称 "Assembly": "Services.exe", //非空程序集 "Methods": "Services.Tasks.PingTask", //非空执行类名 对应业务的类名 "ExecType": 3, //执行类型 ( 0:按指定间隔时间执行 1:每天指定时间执行 每天一次 2:指定时间执行一次 3.每天指定开始和结束时间并且按照指定间隔时间执行) 可空默认0 "S_Interval": 60, //间隔时间 单位秒 可空默认60 "M_Interval": 0, //间隔时间 单位分 可空默认0 "H_Interval": 0, //间隔时间 单位小时 可空默认0 "ExecDayTime": null, //ExecType为1时起效 每天指定时间执行 格式 HH:mm:ss 14:00:00 可空 "ExecDayStartTime": "04:00:00", //ExecType为3时起效 格式 HH:mm:ss 14:00:00 可空 "ExecDayEndTime": "06:00:00", //ExecType为3时起效 格式 HH:mm:ss 14:00:00 可空 "ExecTime": null, //ExecType为2时必填 指定时间执行一次 datetime yyyy-MM-dd HH:mm:ss 执行一次后结束 "Param": "ping baidu.com" //自定义参数 } ]