/// <summary> /// 扫描命令队列并添加到任务池 /// </summary> private static void ScanCommandAndExecute() { //1.扫描分配给该节点的任务命令(读库或者直接读webapi) //2.遍历命令集合,并从命令池中找寻命令并执行,执行成功,更新命令队列,执行失败也更新命令状态 var r = NodeProxy.PostToServer <LoadCommandQueueListResponse, LoadCommandQueueListRequest>(ProxyUrl.LoadCommandQueueList_Url, new LoadCommandQueueListRequest() { NodeId = GlobalNodeConfig.NodeID, Source = Source.Node, LastMaxId = lastMaxID }); if (r.Status != ResponesStatus.Success) { onInitTaskPool("读取命令失败,服务器返回:" + JsonConvert.SerializeObject(r)); return; } if (r.Data.CommandQueueList.Count > 0) { onInitTaskPool("当前节点扫描到" + r.Data.CommandQueueList.Count + "条命令,并执行中"); } foreach (var item in r.Data.CommandQueueList) { try { CommandPoolManager.CreateInstance().Get(item.commanddetailid.ToString()).commandBase.Execute(); //更新命令队列节点状态 var r2 = NodeProxy.PostToServer <EmptyResponse, UpdateCommandQueueStatusRequest>(ProxyUrl.UpdateCommandQueueStatus_Url, new UpdateCommandQueueStatusRequest() { NodeId = GlobalNodeConfig.NodeID, Source = Source.Node, CommandQueueId = item.id, CommandStatus = CommandQueueStatus.ExecuteSuccess }); if (r2.Status != ResponesStatus.Success) { onInitTaskPool("更新命令状态(成功)失败,服务器返回:" + JsonConvert.SerializeObject(r)); //记录节点错误日志 return; } //更新命令状态为成功 onInitTaskPool(string.Format("当前节点执行命令成功! id:{0},命令名:{1},命令参数:{2}", item.id, item.commandmainclassname, item.commandparams)); } catch (Exception ex) { //更新命令状态为错误 var r2 = NodeProxy.PostToServer <EmptyResponse, UpdateCommandQueueStatusRequest>(ProxyUrl.UpdateCommandQueueStatus_Url, new UpdateCommandQueueStatusRequest() { NodeId = GlobalNodeConfig.NodeID, Source = Source.Node, CommandQueueId = item.id, CommandStatus = CommandQueueStatus.ExecuteError }); if (r2.Status != ResponesStatus.Success) { onInitTaskPool("执行节点命令异常,更新命令状态为错误,服务器返回:" + JsonConvert.SerializeObject(r)); //记录节点错误日志 return; } //添加任务执行失败日志 onInitTaskPool("执行节点命令异常:任务id:" + item.taskid + ",命令名称:" + item.commandmainclassname + "(" + item.id + ")", ex); } } }
/// <summary> /// 构建命令池 /// </summary> public void BuildCommandPool() { try { //读取库中命令,然后反射创建对象,封装命令运行时信息,并添加到命令池中 var r = NodeProxy.PostToServer <LoadCommandListResponse, LoadCommandListRequest>(ProxyUrl.LoadCommandList_Url, new LoadCommandListRequest() { NodeId = GlobalNodeConfig.NodeID.ToString(), Source = Source.Node }); if (r.Status != ResponesStatus.Success) { onInit("读取命令失败,服务器返回:" + JsonConvert.SerializeObject(r)); return; } if (r.Data.CommandLibDetailList.Count <= 0) { onInit("读取到0条命令,无法构建命令池"); return; } int commandCount = r.Data.CommandLibDetailList.Count; onInit("读取到" + commandCount.ToString() + "条命令"); onInit("开始创建命令对象,并添加到命令池"); int sucess = 0; int failed = 0; foreach (var item in r.Data.CommandLibDetailList) { try { var cmdruntime = CommandFactory.Create(item); if (cmdruntime != null) { CommandPoolManager.CreateInstance().Add(item.id.ToString(), cmdruntime); sucess += 1; } else { onInit("命令:" + item.commandname + "(" + item.id.ToString() + "),添加到命令池失败!创建命令对象为null"); failed += 1; } } catch (Exception ex) { onInit("命令:" + item.commandname + "(" + item.id.ToString() + "),添加到命令池失败!", ex); failed += 1; } } onInit("构建命令池完成,命令总数量:" + commandCount + ",成功数量:" + sucess.ToString() + ",失败数量:" + failed.ToString()); } catch (Exception ex) { onInit("命令池构建失败:" + ex.Message, ex); } }
///// <summary> ///// 上一次日志扫描的最大id ///// </summary> //public static int lastMaxID = -1; #region 开启任务扫描 /// <summary> /// 开启任务扫描 /// </summary> /// <returns></returns> public override bool StartScanCommandQueue() { //1.扫描分配给该节点的任务命令(读库或者直接读webapi) //2.遍历命令集合,并从命令池中找寻命令并执行,执行成功,更新命令队列,执行失败也更新命令状态 var r = NodeProxy.PostToServer <LoadCommandQueueListResponse, LoadCommandQueueListRequest>(ProxyUrl.LoadCommandQueueList_Url, new LoadCommandQueueListRequest() { NodeId = GlobalNodeConfig.NodeID, Source = Source.Node, LastMaxId = GlobalNodeConfig.NodeInfo.lastmaxid, CommandStatus = (int)Model.enums.ExecuteStatus.NoExecute }); if (r.Status != ResponesStatus.Success) { onScanMsg("读取命令失败,服务器返回:" + JsonConvert.SerializeObject(r)); return(false); } int sucess = 0; int failed = 0; List <string> cmdQueueIdList = new List <string>(); r.Data.CommandQueueList.ForEach(x => cmdQueueIdList.Add(x.id.ToString())); if (r.Data.CommandQueueList.Count > 0) { onScanMsg("当前节点扫描到" + r.Data.CommandQueueList.Count + "条命令(" + string.Join(",", cmdQueueIdList.ToArray()) + "),并执行中"); } foreach (var item in r.Data.CommandQueueList) { try { GlobalNodeConfig.NodeInfo.lastmaxid = item.id > GlobalNodeConfig.NodeInfo.lastmaxid ? item.id : GlobalNodeConfig.NodeInfo.lastmaxid; CommandPoolManager.CreateInstance().Get(item.commanddetailid.ToString()).commandBase.CommandQueue = item; CommandPoolManager.CreateInstance().Get(item.commanddetailid.ToString()).commandBase.TryExecute(); sucess += 1; //更新命令状态为成功 onScanMsg(string.Format("当前节点执行命令成功! id:{0},命令名:{1},命令参数:{2}", item.id, item.commandmainclassname, item.commandparams)); } catch (Exception ex) { failed += 1; //添加任务执行失败日志 onScanMsg("执行节点命令异常:任务id:" + item.taskid + ",命令名称:" + item.commandmainclassname + "(" + item.id + ")", ex); } } onScanMsg("当前循环扫描命令队列完成,保存上次最大命令队列id值:" + GlobalNodeConfig.NodeInfo.lastmaxid + ",扫描到命令个数:" + r.Data.CommandQueueList.Count + ",执行成功个数:" + sucess + ",执行失败个数:" + failed); return(true); }
/// <summary> /// 静态初始化 /// </summary> static CommandPoolManager() { _commandpoolmanager = new CommandPoolManager(); }