Exemplo n.º 1
0
        /// <summary>
        /// 开始执行全部。
        /// </summary>
        public void Start()
        {
            //Note:线程锁定
            lock (this)
            {
                _log.DebugFormat("----- 服务启动开始 -----");

                //初始化任务集合
                Tasks = new List <TaskProvider>();

                //载入所有配置
                TaskSetting          = TaskConfig.GetInstance();
                TaskSetting.Changed += TaskConfigChanged; //只保留一次的事件

                //Note:初始化计时器
                _watcher          = new Timer(TaskSetting.WatchTimer.DelayMillisecond); //Note:第一次运行不按间隔时间执行。
                _watcher.Elapsed += Working;
                _watcher.Start();                                                       //启动工作回调
                _log.Debug($"监视工人第一次工作将于{TimeSpan.FromMilliseconds(_watcher.Interval)}后执行");
                _log.Debug("----- 服务启动完成 -----");
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// 配置变更 线程回调
        /// </summary>
        void ConfigChangeTimerCallback(object state)
        {
            Changed?.Invoke(this, (FileSystemEventArgs)state);

            _fileWatcher.Changed -= ConfigChanged;
            _fileWatcher = null;
            _instance = null;    //文件变更时应该重新反序列化配置信息
        }
Exemplo n.º 3
0
 /// <summary>
 /// 配置实例
 /// </summary>
 /// <returns></returns>
 public static TaskConfig GetInstance(bool isReload= false)
 {
     if (_instance == null)
     {
         lock (syncObject)
         {
             if(isReload) _instance = null;
             if (_instance != null) return _instance;
             logRun.Debug("TaskConfig实例化");
             _instance = new TaskConfig();
             _instance.Initialize();
         }
     }
     else
     {
         logRun.Debug("返回缓存的的TaskConfig实例");
     }
     return _instance;
 }
Exemplo n.º 4
0
        /// <summary>
        /// Note:序列化,从配置中获取所有数据
        /// </summary>
        /// <returns></returns>
        public void Initialize()
        {
            using (var reader = XmlReader.Create(GetFullPath(FILE_NAME)))
            {
                logRun.Debug("任务配置实例初始化开始...");
                var slz = new XmlSerializer(typeof(TaskConfig));
                var rst = slz.Deserialize(reader) as TaskConfig;
                reader.Close();
                _instance = rst; //获得实例
                if (_instance != null && _instance.Tasks.Count > 0)
                {
                    foreach (var task in _instance.Tasks)
                    {
                        //相关配置初始化,保持默认值的合法性

                        //锁定超时至少5秒
                        if (task.WorkSetting.Timeout < 5) task.WorkSetting.Timeout = 5;
                        var taskId = task.Meta.Id;
                        //1. 任务Id唯一性检测
                        var tmpJobs = _instance.Tasks.FindAll(x => x.Meta.Id == taskId);
                        //logRun.Debug($"jobs[{taskId}]={tmpJobs.Count}");
                        if (tmpJobs.Count < 2)
                        {
                            //没有重复的任务Id
                            task.Meta.TaskHash = task.Type.GetHashCode();
                            logRun.Debug($"{task}的任务Hash:{task.Meta.TaskHash}");
                        }
                        else
                        {
                            var msg = $"Task.Id={taskId}重复,{FILE_NAME}里每一个Job的Id必须是与其它任务的Id不同的数字。";
                            logRun.ErrorFormat(msg);
                            throw new ConfigurationErrorsException(msg);
                        }
                    }
                }
            }

            if (_instance == null)
            {
                var msg = $"请查检{FILE_NAME}配置文件是否存在并且配置正确。";
                logRun.ErrorFormat(msg);
                throw new ConfigurationErrorsException(msg);
            }

            //计时器初始化
            if (_instance.WatchTimer == null) _instance.WatchTimer = new TimerConfig();

            //初始化运行状态
            //instance.Execution = ExecutionStatus.Instance();
            logRun.DebugFormat("初始化一个新的XML运行状态实例");
            _execution = ExecutionStatus.Instance();

            //var instance =  Serializer.XmlDeserializerFormFile<TaskConfig>();
            //将上次运行状态恢复至本实例中
            foreach (var task in _instance.Tasks)
            {
                var jobId = task.Meta.Id;
                //任务状态初始化或匹配
                var job = _execution.Tasks[jobId]; //查询Job的运行情况
                if (job == null)
                {
                    logRun.DebugFormat("开始初始化任务({0})运行状态[新的]。", task.Meta.Name);
                    task.Execution = new ExecutionInfo();  //初始化新执行状态
                    _execution.Tasks.Add(task.Meta);     //工作运行状态增加
                }
                else
                {
                    logRun.DebugFormat("开始读取任务({0})运行状态[已有的]。", task.Meta.Name);
                    //task.Execution = _execution.Tasks[task.Meta.Id].Execution;      //运行配置上的状态引用更新到任务上

                    //Note:序列化时将状态置为默认,因为有些异常会奖Runing记下使得该任务再也无法运行了。
                    task.Execution.RunStatus = TaskRunStatusType.Default;
                }
                task.Execution.IsExsit = true;
            }

            ////更新已移除的任务状态
            //foreach (var job in _execution.Tasks)
            //{
            //    if (!job.Execution.IsExsit)
            //    {
            //        job.Execution.RunStatus = TaskRunStatusType.Removing;
            //    }
            //}
            //Save();
            logRun.DebugFormat("任务配置实例化完成。");
            _instance.Execution = _execution;
        }
Exemplo n.º 5
0
        /// <summary>
        /// Note:序列化,从配置中获取所有数据
        /// </summary>
        /// <returns></returns>
        public void Initialize()
        {
            using (var reader = XmlReader.Create(GetFullPath(FILE_NAME)))
            {
                logRun.Debug("任务配置实例初始化开始...");
                var slz = new XmlSerializer(typeof(TaskConfig));
                var rst = slz.Deserialize(reader) as TaskConfig;
                reader.Close();
                _instance = rst; //获得实例
                if (_instance != null && _instance.Tasks.Count > 0)
                {
                    foreach (var task in _instance.Tasks)
                    {
                        //相关配置初始化,保持默认值的合法性

                        //锁定超时至少5秒
                        if (task.WorkSetting.Timeout < 5)
                        {
                            task.WorkSetting.Timeout = 5;
                        }
                        var taskId = task.Meta.Id;
                        //1. 任务Id唯一性检测
                        var tmpJobs = _instance.Tasks.FindAll(x => x.Meta.Id == taskId);
                        //logRun.Debug($"jobs[{taskId}]={tmpJobs.Count}");
                        if (tmpJobs.Count < 2)
                        {
                            //没有重复的任务Id
                            task.Meta.TaskHash = task.Type.GetHashCode();
                            logRun.Debug($"{task}的任务Hash:{task.Meta.TaskHash}");
                        }
                        else
                        {
                            var msg = $"Task.Id={taskId}重复,{FILE_NAME}里每一个Job的Id必须是与其它任务的Id不同的数字。";
                            logRun.ErrorFormat(msg);
                            throw new ConfigurationErrorsException(msg);
                        }
                    }
                }
            }


            if (_instance == null)
            {
                var msg = $"请查检{FILE_NAME}配置文件是否存在并且配置正确。";
                logRun.ErrorFormat(msg);
                throw new ConfigurationErrorsException(msg);
            }

            //计时器初始化
            if (_instance.WatchTimer == null)
            {
                _instance.WatchTimer = new TimerConfig();
            }

            //初始化运行状态
            //instance.Execution = ExecutionStatus.Instance();
            logRun.DebugFormat("初始化一个新的XML运行状态实例");
            _execution = ExecutionStatus.Instance();

            //var instance =  Serializer.XmlDeserializerFormFile<TaskConfig>();
            //将上次运行状态恢复至本实例中
            foreach (var task in _instance.Tasks)
            {
                var jobId = task.Meta.Id;
                //任务状态初始化或匹配
                var job = _execution.Tasks[jobId]; //查询Job的运行情况
                if (job == null)
                {
                    logRun.DebugFormat("开始初始化任务({0})运行状态[新的]。", task.Meta.Name);
                    task.Execution = new ExecutionInfo(); //初始化新执行状态
                    _execution.Tasks.Add(task.Meta);      //工作运行状态增加
                }
                else
                {
                    logRun.DebugFormat("开始读取任务({0})运行状态[已有的]。", task.Meta.Name);
                    //task.Execution = _execution.Tasks[task.Meta.Id].Execution;      //运行配置上的状态引用更新到任务上

                    //Note:序列化时将状态置为默认,因为有些异常会奖Runing记下使得该任务再也无法运行了。
                    task.Execution.RunStatus = TaskRunStatusType.Default;
                }
                task.Execution.IsExsit = true;
            }

            ////更新已移除的任务状态
            //foreach (var job in _execution.Tasks)
            //{
            //    if (!job.Execution.IsExsit)
            //    {
            //        job.Execution.RunStatus = TaskRunStatusType.Removing;
            //    }
            //}
            //Save();
            logRun.DebugFormat("任务配置实例化完成。");
            _instance.Execution = _execution;
        }