• 简单的.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" //自定义参数
      }
    ]
    View Code
     

    框架代码路径:框架代码

  • 相关阅读:
    Pass360[最新].cpp
    在任意的远程桌面的session中运行指定的程序
    C++内存泄露的检测(三)
    在release模式下debug
    [转]VC Studio 使用技巧大全
    C++内存泄露的检测(一)
    获取系统用户所对应的配置路径
    关于Debug和Release之本质区别的讨论
    GDB 的使用
    struct termios
  • 原文地址:https://www.cnblogs.com/Jimmy-pan/p/services.html
Copyright © 2020-2023  润新知