static void RunCommond() { lock (_lockRunLoop) { try { List <tb_command_model> commands = new List <tb_command_model>(); try { SqlHelper.ExcuteSql(GlobalConfig.TaskDataBaseConnectString, (c) => { tb_command_dal commanddal = new tb_command_dal(); if (lastMaxID < 0) { lastMaxID = commanddal.GetMaxCommandID(c); } commands = commanddal.GetNodeCommands(c, GlobalConfig.NodeID, lastMaxID); }); } catch (Exception exp2) { LogHelper.AddNodeError("获取当前节点命令集错误", exp2); } if (commands.Count > 0) { LogHelper.AddNodeLog("当前节点扫描到" + commands.Count + "条命令,并执行中...."); } foreach (var c in commands) { try { CommandFactory.Execute(c); SqlHelper.ExcuteSql(GlobalConfig.TaskDataBaseConnectString, (conn) => { new tb_command_dal().UpdateCommandState(conn, c.id, (int)EnumTaskCommandState.Success); }); LogHelper.AddNodeLog(string.Format("当前节点执行命令成功! id:{0},命令名:{1},命令内容:{2}", c.id, c.commandname, c.command)); } catch (Exception exp1) { try { SqlHelper.ExcuteSql(GlobalConfig.TaskDataBaseConnectString, (conn) => { new tb_command_dal().UpdateCommandState(conn, c.id, (int)EnumTaskCommandState.Error); }); } catch { } LogHelper.AddTaskError("执行节点命令失败", c.taskid, exp1); } lastMaxID = Math.Max(lastMaxID, c.id); } } catch (Exception exp) { LogHelper.AddNodeError("系统级不可恢复严重错误", exp); } } }
/// <summary> /// 运行消息循环 /// </summary> static void RuningCommandLoop() { LogHelper.AddNodeLog("准备接受命令并运行消息循环..."); while (true) { System.Threading.Thread.Sleep(1000); RunCommond(); System.Threading.Thread.Sleep(5000); } }
/// <summary> /// 恢复已开启的任务 /// </summary> static void RecoveryStartTasks() { try { LogHelper.AddNodeLog("当前节点启动成功,准备恢复已经开启的任务..."); List <int> taskids = new List <int>(); SqlHelper.ExcuteSql(GlobalConfig.TaskDataBaseConnectString, (c) => { tb_task_dal taskdal = new tb_task_dal(); taskids = taskdal.GetTaskIDsByState(c, (int)EnumTaskState.Running, GlobalConfig.NodeID); }); foreach (var taskid in taskids) { try { CommandFactory.Execute(new tb_command_model() { command = "", commandcreatetime = DateTime.Now, commandname = Core.EnumTaskCommandName.StartTask.ToString(), commandstate = (int)Core.EnumTaskCommandState.None, nodeid = GlobalConfig.NodeID, taskid = taskid, id = -1 }); } catch (Exception exp) { LogHelper.AddTaskError(string.Format("恢复已经开启的任务{0}失败", taskid), taskid, exp); } } LogHelper.AddNodeLog(string.Format("恢复已经开启的任务完毕,共{0}条任务重启", taskids.Count)); } catch (Exception exp) { LogHelper.AddNodeError("恢复已经开启的任务失败", exp); } }
static void RunCommond() { lock (_lockRunLoop) { try { List <tb_command_model> commands = new List <tb_command_model>(); try { SqlHelper.ExcuteSql(GlobalConfig.ConnectionString, (conn) => { tb_command_dal commanddal = new tb_command_dal(); if (lastMaxID < 0) { lastMaxID = commanddal.GetMaxCommandID(conn); } commands = commanddal.GetNodeCommands(conn, GlobalConfig.NodeID, lastMaxID); }); } catch (Exception ex) { LogHelper.AddNodeError("获取当前节点命令集错误", ex); } if (commands.Count > 0) { LogHelper.AddNodeLog("当前节点扫描到" + commands.Count + "条命令,并执行中...."); } foreach (var c in commands) { EnumTaskCommandState enumTaskCommandState = EnumTaskCommandState.Error; EnumTaskState enumTaskState = EnumTaskState.UnInstall; try { SqlHelper.ExcuteSql(GlobalConfig.ConnectionString, (conn) => { tb_task_dal taskDAL = new tb_task_dal(); var task = taskDAL.GetOneTask(conn, c.taskid); tb_version_dal versionDAL = new tb_version_dal(); var version = versionDAL.GetVersionByTaskID(conn, c.taskid); string path = $"{AppDomain.CurrentDomain.BaseDirectory}{task.taskname}"; if (!Directory.Exists(path)) { Directory.CreateDirectory(path); if (version != null) { string zipFilePath = $"{path}\\{version.zipfilename}"; ///数据库二进制转压缩文件 CompressHelper.ConvertToFile(version.zipfile, zipFilePath); CompressHelper.UnCompress(zipFilePath, path); ///删除压缩文件 File.Delete(zipFilePath); ///初始化shell脚本 InitScript.InstallScript(task.taskname, task.taskmainclassdllfilename); InitScript.UninstallScript(task.taskname); InitScript.StartScript(task.taskname); InitScript.StopScript(task.taskname); } else { throw new Exception($"在tb_version表中未查到taskid:{c.taskid}数据"); } } if (c.commandname == EnumTaskCommandName.StartTask.Tostring()) { if (ServiceHelper.ServiceState(task.taskname) == EnumTaskState.UnInstall) { CommandFactory.Execute(path + "\\install.bat"); } ///线程睡眠5s,等待服务安装完成 Thread.Sleep(5000); CommandFactory.Execute(path + "\\start.bat"); ///线程睡眠2s,等到脚本执行完成 Thread.Sleep(2000); if (ServiceHelper.ServiceState(task.taskname) == EnumTaskState.Running) { enumTaskCommandState = EnumTaskCommandState.Success; enumTaskState = EnumTaskState.Running; } } else if (c.commandname == EnumTaskCommandName.ReStartTask.Tostring()) { CommandFactory.Execute(path + "\\start.bat"); ///线程睡眠2s,等到脚本执行完成 Thread.Sleep(2000); if (ServiceHelper.ServiceState(task.taskname) == EnumTaskState.Running) { enumTaskCommandState = EnumTaskCommandState.Success; enumTaskState = EnumTaskState.Running; } } else if (c.commandname == EnumTaskCommandName.StopTask.Tostring()) { CommandFactory.Execute(path + "\\stop.bat"); ///线程睡眠2s,等到脚本执行完成 Thread.Sleep(2000); if (ServiceHelper.ServiceState(task.taskname) == EnumTaskState.Stop) { enumTaskCommandState = EnumTaskCommandState.Success; enumTaskState = EnumTaskState.Stop; } } else if (c.commandname == EnumTaskCommandName.UninstallTask.Tostring()) { if (ServiceHelper.ServiceState(task.taskname) == EnumTaskState.Running) { CommandFactory.Execute(path + "\\stop.bat"); Thread.Sleep(2000); } CommandFactory.Execute(path + "\\uninstall.bat"); ///线程睡眠2s,等到脚本执行完成 Thread.Sleep(2000); if (ServiceHelper.ServiceState(task.taskname) == EnumTaskState.UnInstall) { enumTaskCommandState = EnumTaskCommandState.Success; } } ///更新命令状态 new tb_command_dal().UpdateCommandState(conn, c.id, (int)enumTaskCommandState); ///更新服务状态 new tb_task_dal().UpdateTaskState(conn, c.taskid, (int)enumTaskState); if (enumTaskCommandState == EnumTaskCommandState.Success) { LogHelper.AddNodeLog($"节点:{c.nodeid}成功执行任务:{c.taskid}……"); } }); } catch (Exception ex) { LogHelper.AddTaskError("任务执行错误", c.taskid, ex); } } } catch (Exception ex) { LogHelper.AddNodeLog($"节点执行错误,错误原因:{ex.Message}"); } } }