示例#1
0
 public ResponseBase <EmptyResponse> AddCommandExecuteLog(AddCommandExecuteLogRequest req)
 {
     try
     {
         //添加执行命令日志
         cmdLogRespository.Add(new tb_commandlog()
         {
             commanddetailid  = req.CommandDetailId,
             commandendtime   = Convert.ToDateTime(req.CommandEndTime),
             commandparams    = req.CommandParams,
             commandqueueid   = req.CommandQueueId,
             commandstarttime = Convert.ToDateTime(req.CommandStartTime),
             commandstate     = req.ExecuteStatus,
             logcreatetime    = DateTime.Now,
             msg           = req.CommandExecuteLog,
             nodeid        = req.NodeId,
             totalruntime  = int.Parse(req.TotalTime),
             commandresult = req.CommandResult,
         });
         var cmdqueuemodel = cmdqueuerespository.FindSingle(x => x.id == req.CommandQueueId && x.nodeid == req.NodeId);
         if (cmdqueuemodel == null)
         {
             return(ResponseToClient <EmptyResponse>(ResponesStatus.Failed, "更新命令队列状态失败"));
         }
         cmdqueuemodel.commandstate = req.ExecuteStatus;
         //更新命令队列执行状态
         if (req.ExecuteStatus != (int)ExecuteStatus.ExecuteSucess)
         {
             //更新命令队列失败次数
             cmdqueuemodel.failedcount += 1;
         }
         cmdqueuerespository.Update(cmdqueuemodel);  //更新命令实体失败次数
         return(ResponseToClient <EmptyResponse>(ResponesStatus.Success, ""));
     }
     catch (Exception ex)
     {
         return(ResponseToClient <EmptyResponse>(ResponesStatus.Exception, JsonConvert.SerializeObject(ex)));
     }
 }
        }                                                                                                //从左到右,第一位:代表大版本迭代 ,第二位:代表大版本下的大更新 第三位:代表bug修复次数

        /// <summary>
        /// 命令执行方法约定
        /// </summary>
        public void TryExecute()
        {
            try
            {
                ShowCommandLog("----------------------" + DateTime.Now + ":开始执行命令-----------------------------------------");
                DateTime         startTime = DateTime.Now;
                Stopwatch        sw        = new Stopwatch();
                RunCommandResult r;
                sw.Start();
                try
                {
                    r = Execute();
                    int retryCount = 0;
                    while (r.ExecuteStatus == ExecuteStatus.ExecuteException && retryCount < this.CommandDetail.maxexeceptionretrycount)
                    {
                        int ct = retryCount + 1;
                        ShowCommandLog("**********第" + ct + "次重试 Start**********");
                        r           = Execute();
                        retryCount += 1;
                        ShowCommandLog("**********第" + ct + "次重试 End**********");
                    }
                    r.RetryCount += retryCount;
                }
                catch (Exception ex)
                {
                    r = new RunCommandResult()
                    {
                        ExecuteStatus = ExecuteStatus.ExecuteException, Message = ex.Message, Ex = ex
                    };
                    ShowCommandLog("执行命令异常,异常信息:" + JsonConvert.SerializeObject(ex));
                }
                sw.Stop();
                ShowCommandLog("----------------------" + DateTime.Now + ":执行命令完成-----------------------------------------");
                DateTime endTime = DateTime.Now;
                TimeSpan ts      = sw.Elapsed;
                long     times   = sw.ElapsedMilliseconds / 1000;//秒
                AddCommandExecuteLogRequest addLogReq = new AddCommandExecuteLogRequest()
                {
                    NodeId            = GlobalNodeConfig.NodeID,
                    Source            = Source.Node,
                    CommandEndTime    = endTime.ToString("yyyy-MM-dd HH:mm:ss"),
                    CommandExecuteLog = strLog.ToString(),
                    CommandParams     = JsonConvert.SerializeObject(this.AppConfig),
                    CommandQueueId    = CommandQueue.id,
                    CommandResult     = JsonConvert.SerializeObject(r),
                    ExecuteStatus     = (int)r.ExecuteStatus,
                    CommandStartTime  = startTime.ToString("yyyy-MM-dd HH:mm:ss"),
                    TotalTime         = times.ToString(),
                    CommandDetailId   = CommandDetail.id,
                };
                //上报命令执行日志和执行结果
                var r2 = NodeProxy.PostToServer <EmptyResponse, AddCommandExecuteLogRequest>(ProxyUrl.AddCommandExecuteLog_Url, addLogReq);
                if (r2.Status != ResponesStatus.Success)
                {
                    ShowCommandLog("上报命令(" + CommandDetail.commandmainclassname + ")的执行日志失败,请求地址:" + ProxyUrl.AddCommandExecuteLog_Url + ",请求参数:" + JsonConvert.SerializeObject(addLogReq) + ",服务器返回参数:" + JsonConvert.SerializeObject(r2));
                }
                if (r.ExecuteStatus == ExecuteStatus.ExecuteException)//命令执行异常,报警
                {
                    string        title      = "当前命令队列(" + CommandQueue.id + ")执行失败,请及时处理";
                    StringBuilder strContent = new StringBuilder();
                    strContent.AppendLine("节点编号:" + GlobalNodeConfig.NodeID);
                    strContent.AppendLine("命令队列编号/命令编号:" + CommandQueue.id + "/" + CommandDetail.id.ToString());
                    strContent.AppendLine("命令执行参数:" + JsonConvert.SerializeObject(this.AppConfig));
                    strContent.AppendLine("命令执行起/止时间:" + startTime.ToString("yyyy-MM-dd HH:mm:ss") + "/" + endTime.ToString("yyyy-MM-dd HH:mm:ss"));
                    strContent.AppendLine("命令执行耗时(s):" + times.ToString());
                    strContent.AppendLine("命令执行结果,状态:" + r.ExecuteStatus.description() + ",执行结果:" + JsonConvert.SerializeObject(r));
                    AlarmHelper.AlarmAsync(GlobalNodeConfig.NodeInfo.isenablealarm, (AlarmType)GlobalNodeConfig.NodeInfo.alarmtype, GlobalNodeConfig.Alarm, title, strContent.ToString());
                }
            }
            catch (Exception ex)
            {
                ShowCommandLog("执行命令异常,异常信息:" + JsonConvert.SerializeObject(ex));
                ShowCommandLog("----------------------" + DateTime.Now + ":执行命令完成-----------------------------------------");
                log.Error(strLog.ToString());
            }
            finally
            {
                strLog.Clear();//正常执行完情况strLog日志
            }
        }