zoukankan      html  css  js  c++  java
  • 任务集框架的设计

    任务集框架的设计

    任务集框架的设计意图

             该框架设计主要用于后台执行任务,只需要动态的去添加执行任务即可,而不需要关心任务开始、停止以及任务状态信息等。旨在更加方便的去管理多个任务。

    任务集框架的设计图

             任务集框架设置图如下,主要分为4大模块,config、log、help、task 这四个模块。

             Config 模块主要是各个任务的配置文件。

             Log模块主要是记录各个任务产生的日志文件。

             Helper模块主要是所有的任务需要用到的工具集。

             Tasks 模块主要是各个任务的集合

    任务集框架的设计模块详解

    1.       主程序模块

    该模块主要用于任务框架开启停止的入口,同时配置界面,可以在框架运行过程中手动

    开启,停止任务以及配置任务。通过界面展示,可以详细的看到任务的执行次数,错误次数以及任务的当前状态。界面如下:

    任务状态:表示任务当前的执行状态。表示当前任务未开启,表示当前任务已暂停,表示当前任务正在运行中。

    任务次数:表示当前任务总共执行的次数。

    错误次数:表示当前任务总共执行的错误次数

    任务周期:表示当前任务执行了多少个任务周期,一个周期是86400个任务次数。

    2.       Config模块

    该模块用于所有的任务的配置。

    示例如下:

    <?xml version="1.0" encoding="utf-8" ?>

    <root>

      <dataenginerpath>C:UsersliningDocumentsVisual Studio 2015Projects1EcgNetPluginx86DebugconfigFetalDataEnginer elease estpro.exe</dataenginerpath>

      <dataenginername>testPro</dataenginername>

      <!--休眠时间-->

      <sleeptime>10000</sleeptime>

    </root>

    3.       Log模块

    该模块用于记录所有的任务在运行期间的日志数据。该模块使用Log4Net,一个开源的

    日志库。感觉还是挺好用的。几乎能想到的功能都有。

    日志示例如下:

    2017-07-24 08:47:56,382 FetalDataEnginerWorkJob [8] ERROR Process.Kill:拒绝访问。

    2017-07-24 08:48:08,891 FetalDataEnginerWorkJob [8] ERROR Process.Kill:拒绝访问。

    2017-07-24 08:58:01,891 FetalDataEnginerWorkJob [9] ERROR Process.Kill:拒绝访问。

    2017-07-24 08:58:12,431 FetalDataEnginerWorkJob [9] ERROR Process.Kill:拒绝访问。

    2017-07-24 09:00:08,782 FetalDataEnginerWorkJob [10] ERROR Process.Kill:拒绝访问。

    2017-07-24 09:04:39,821 FetalDataEnginerWorkJob [9] ERROR Process.Kill:拒绝访问。

    2017-07-24 10:22:19,719 FetalDataEnginerWorkJob [10] ERROR Process.Kill:拒绝访问。

    2017-07-24 10:24:03,266 FetalDataEnginerWorkJob [1] ERROR Process.Kill:拒绝访问。

    2017-07-24 10:25:33,186 FetalDataEnginerWorkJob [1] ERROR Process.Kill:拒绝访问。

    2017-07-24 10:30:00,554 FetalDataEnginerWorkJob [1] ERROR Process.Kill:拒绝访问。

    2017-07-24 10:43:53,695 FetalDataEnginerWorkJob [1] ERROR Process.Kill:拒绝访问。

    2017-07-24 14:43:51,249 FetalDataEnginerWorkJob [10] ERROR Process.Kill:拒绝访问。

    2017-07-24 16:17:50,396 FetalDataEnginerWorkJob [9] ERROR Process.Kill:拒绝访问。

    2017-07-24 16:18:07,162 FetalDataEnginerWorkJob [10] ERROR Process.Kill:拒绝访问。

    4.       Helper 模块

    该模块主要是一些工具的集合,该项目中目前存放一些数据库的操作类,以及XML 文

    档的操作类等。

    5.       Tasks模块

    该模块是所有的任务执行实体,每个任务继承BaseJob,然后实现里面的Start Stop 和

    Run 方法。BaseJob 会在每秒钟会发送一次任务的执行状态,任务子类发送自己的状态信息给主程序。

    示例代码如下:

    StatisticWorkJob.cs
    public class StatisticWorkJob:BaseJob
    {
            private ILog log = null;
            private string connStr = "";
            private StatisticWorkDb db = null;
            private int sleepTime = 2000;
            public StatisticWorkJob(string name)
            {
                Init(name);
            }
            public override void Init(string name)
            {
                base.Init(name);
                log = LogManager.GetLogger("StatisticWorkJob");
            }
            public override bool Start(int sleep = 1000)
            {
                log.Info("Start");
                bool ret = false;
                ret = ReadConfigFile();
                if (!ret)
                {
                    log.Error("ReadConfigFile is false and return");
                    ReportWorkState(2, 1);
                    return false;
                }
                db = new StatisticWorkDb(connStr);
                return base.Start(sleepTime);
            }
            public override bool Stop()
            {
                return base.Stop();
            }
            public override void Run()
            {
                while(running)
                {
                    //第一件事 更新所有的区的医疗服务中心数量
                    DoThingsUpdateAllMedicalServiceNum();
                    //第二件事 更新所有的科室的设备数量
                    DoThingUpdateAllMedicalDeviceNum();
                    //第三件事 更新所有的统计诊端表
                    DoThingUpdateAllDiagnosNum();
                    //Thread.Sleep(sleepTime);
                    base.Run();
                }
            }
            private void DoThingUpdateAllDiagnosNum()
            {
                try
                {
                    //throw new NotImplementedException();
                }
                catch(Exception e)
                {
                    log.Error("DoThingUpdateAllDiagnosNum:error:" + e.Message);
                    ReportWorkState(2, 1);
                }
            }
            private void DoThingUpdateAllMedicalDeviceNum()
            {
                try
                {          
            }
                catch(Exception e)
                {
                    log.Error("DoThingUpdateAllMedicalDeviceNum:error:" + e.Message);
                    ReportWorkState(2, 1);
                }
            }
            private void DoThingsUpdateAllMedicalServiceNum()
            {
                try
                {
                }
                catch (Exception e)
                {
                    log.Error("DoThingsUpdateAllMedicalServiceNum:error:" + e.Message);
                    ReportWorkState(2, 1);
                }
            }
            private bool ReadConfigFile()
            {
                bool ret = false;
                XmlHelperEx xmlHelper = new XmlHelperEx();
                try
                {
                    if (xmlHelper.LoadXmlFile(configDirectory + "config.xml"))
                    {
                        //加载链接字符串
                        connStr = xmlHelper.GetValue("root/connectionStrings");
                        sleepTime = Convert.ToInt32(xmlHelper.GetValue("root/sleeptime"));
                        ret = true;
                    }
                }
                catch
                {
                    log.Error("LoadXmlFile:" + configDirectory + "config.xml");
                    ReportWorkState(2, 1);
                }
                return ret;
            }
     }
    BaseJob.cs
    public class BaseJob
    {
            public string jsonName = "";
            public Thread td = null;
            public bool running = false;
            private int sleepTimeState = 1000;
            public int sleepTimeWork = 1000;
            private int sleepTemp = 0;
            public string workName = string.Empty;
            public string configDirectory = string.Empty;
            public delegate void DelagateWorkState(string name,int code,int cnt);
            public event DelagateWorkState evetWorkState = null;
            public virtual void Init(string name)
            {
                workName = name;
                configDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
            }
            public void SetConfigDirectory(string dir)
            {
                configDirectory = dir;
            }
            public string GetConfigDirectory()
            {
                return configDirectory;
            }
            public virtual bool Start(int sleep = 1000)
            {
                bool ret = false;
                if (!running)
                {
                    sleepTimeWork = sleep;
                    try
                    {
                        running = true;
                        td = new System.Threading.Thread(Run);
                        td.Start();
                        ret = true;
                    }
                    catch
                    {
                        ret = false;
                    }
                }
                return ret;
            }
            public virtual bool Stop()
            {
                bool ret = false;
                if(running)
                {
                    try
                    {
                        if (td != null)
                        {
                            running = false;
                            td.Abort();
                            ret = true;
                        }
                    }
                    catch
                    {
                        ret = false;
                    }
                }
                return ret;
            }
            public string GetWorkName()
            {
                return workName;
            }
            private int WaitingWorkTime()
            {
                int sleeptime = 0;
                if(sleepTimeWork < sleepTimeState)
                {
                    sleeptime = sleepTimeWork;
                }
                else
                {
                    if(sleepTemp + sleepTimeState >= sleepTimeWork)
                    {
                        sleeptime = sleepTemp + sleepTimeState - sleepTimeWork;
                        sleepTemp = 0;
                    }
                    else
                    {
                        sleeptime = sleepTimeState;
                        sleepTemp += sleepTimeState;
                    }
                }
                return sleeptime;
            }
            public void ReportWorkState(int code,int cnt)
            {
                if(evetWorkState != null)
                {
                    evetWorkState(workName,code,cnt);
                }
            }
            public virtual void Run()
            {
                int sleeptime = WaitingWorkTime();
                ReportWorkState(1,1);
                Thread.Sleep(sleeptime);
            }
        }
    

      

  • 相关阅读:
    1-22
    好久未更
    学习进度条 第十六周
    构建之法阅读笔记06
    返回一个整数数组中最大子数组的和(补充:输出该子数组)
    构建执法阅读笔记4
    第三周的学习进度情况
    构建之法阅读笔记03
    四则运算三
    安卓小程序之“标准体重计算器”
  • 原文地址:https://www.cnblogs.com/techdreaming/p/7229918.html
Copyright © 2011-2022 走看看