コード例 #1
0
        protected override void Run()
        {
            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, onlyTask: true);
            });
            List <int> currentscantaskids = new List <int>();

            foreach (var taskid in taskids)
            {
                var taskruntimeinfo = TaskPoolManager.CreateInstance().Get(taskid.ToString());
                if (taskruntimeinfo == null)
                {
                    currentscantaskids.Add(taskid);
                }
            }


            var recovertaskids = (from o in lastscantaskids
                                  from c in currentscantaskids
                                  where o == c
                                  select o).ToList();

            if (recovertaskids != null && recovertaskids.Count > 0)
            {
                recovertaskids.ForEach((c) =>
                {
                    LogHelper.AddTaskError("任务资源运行可能异常停止了", c, new Exception("任务处于运行状态,但是相应集群节点中,未发现任务在运行"));
                });
            }
            lastscantaskids = currentscantaskids;
        }
コード例 #2
0
        protected override void Run()
        {
            var res = NodeProxy.PostToServer <EmptyResponse, UpdateNodeMonitorRequest>(ProxyUrl.UpdateNodeMonitorRequest_Url, new UpdateNodeMonitorRequest()
            {
                MonitorClassName = this.GetType().Name, MonitorStatus = (int)MonitorStatus.Monitoring, NodeId = GlobalNodeConfig.NodeID, Source = Source.Node
            });

            if (res.Status != ResponesStatus.Success)
            {
                LogProxy.AddNodeErrorLog(this.GetType().Name + "监控组件上报监控信息失败,请求地址:" + ProxyUrl.UpdateNodeMonitorRequest_Url + ",返回结果:" + JsonConvert.SerializeObject(res));
            }
            foreach (var taskruntimeinfo in TaskPoolManager.CreateInstance().GetList())
            {
                try
                {
                    if (taskruntimeinfo == null)
                    {
                        continue;
                    }
                    string fileinstallpath = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\') + "\\" + GlobalNodeConfig.TaskDllDir + @"\" + taskruntimeinfo.TaskModel.id;
                    double dirsizeM        = -1;
                    if (System.IO.Directory.Exists(fileinstallpath))
                    {
                        long dirsize = IOHelper.DirSize(new DirectoryInfo(fileinstallpath));
                        dirsizeM = (double)dirsize / 1024 / 1024;
                    }
                    try
                    {
                        if (taskruntimeinfo.Domain != null)
                        {
                            //上报性能
                            AddPerformanceRequest addperformance = new AddPerformanceRequest()
                            {
                                NodeId         = GlobalNodeConfig.NodeID,
                                Cpu            = taskruntimeinfo.Domain.MonitoringTotalProcessorTime.TotalSeconds.ToString(),
                                Memory         = ((double)taskruntimeinfo.Domain.MonitoringSurvivedMemorySize / 1024 / 1024).ToString(),//AppDomain当前正在使用的字节数(只保证在上一次垃圾回收时是准确的)
                                InstallDirsize = dirsizeM.ToString(),
                                TaskId         = taskruntimeinfo.TaskModel.id,
                                Lastupdatetime = (DateTime.Now).ToString(),
                                Source         = Source.Node,
                            };
                            var r = NodeProxy.PostToServer <EmptyResponse, AddPerformanceRequest>(ProxyUrl.AddPerformance_Url, addperformance);
                            if (r.Status != ResponesStatus.Success)
                            {
                                LogProxy.AddTaskErrorLog("任务性能上报出错,请求地址:" + ProxyUrl.AddPerformance_Url + ",请求内容:" + JsonConvert.SerializeObject(addperformance) + ",返回结果:" + JsonConvert.SerializeObject(r), taskruntimeinfo.TaskModel.id);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        LogProxy.AddTaskErrorLog("任务性能监控时出错:taskid=" + taskruntimeinfo.TaskModel.id + ",异常信息:" + JsonConvert.SerializeObject(ex), taskruntimeinfo.TaskModel.id);
                    }
                }
                catch (Exception exp)
                {
                    LogProxy.AddNodeErrorLog("任务性能监控异常,异常信息:" + JsonConvert.SerializeObject(exp));
                }
            }
        }
コード例 #3
0
        protected override void Run()
        {
            try
            {
                var res = NodeProxy.PostToServer <EmptyResponse, UpdateNodeMonitorRequest>(ProxyUrl.UpdateNodeMonitorRequest_Url, new UpdateNodeMonitorRequest()
                {
                    MonitorClassName = this.GetType().Name, MonitorStatus = (int)MonitorStatus.Monitoring, NodeId = GlobalNodeConfig.NodeID, Source = Source.Node
                });
                if (res.Status != ResponesStatus.Success)
                {
                    LogProxy.AddNodeErrorLog(this.GetType().Name + "监控组件上报监控信息失败,请求地址:" + ProxyUrl.UpdateNodeMonitorRequest_Url + ",返回结果:" + JsonConvert.SerializeObject(res));
                }

                LoadTaskIdListRequest req = new LoadTaskIdListRequest()
                {
                    Source = Source.Node, TaskScheduleStatus = (int)TaskScheduleStatus.Scheduling, NodeId = GlobalNodeConfig.NodeID
                };
                var        r = NodeProxy.PostToServer <LoadTaskIdListResponse, LoadTaskIdListRequest>(ProxyUrl.LoadTaskIdList_Url, req);
                List <int> taskschdulinglist = TaskPoolManager.CreateInstance().GetList().Select(x => x.TaskModel.id).ToList();
                if (r.Status != ResponesStatus.Success)
                {
                    //如果服务端没有调度中的,则把本地在调度中的上报状态
                    if (taskschdulinglist.Count > 0)
                    {
                        UploadLocalTask(taskschdulinglist);
                    }
                    return;
                }

                List <int> taskidnotserver = taskschdulinglist.Where(x => !(r.Data.TaskIdList.Contains(x))).ToList();
                r.Data.TaskIdList.ForEach(x =>
                {
                    var taskruntimeInfo = TaskPoolManager.CreateInstance().Get(x.ToString());
                    if (taskruntimeInfo == null)//如果等于空值则报警,说明该任务再
                    {
                        string title             = "节点(id):" + GlobalNodeConfig.NodeInfo.nodename + "(" + GlobalNodeConfig.NodeInfo.id.ToString() + "),任务id:(" + x + ")" + ",调度异常,请及时处理!";
                        StringBuilder strContent = new StringBuilder();
                        strContent.AppendLine("所在节点名称(编号):" + GlobalNodeConfig.NodeInfo.nodename + "(" + GlobalNodeConfig.NodeID + ")<br/>");
                        strContent.AppendLine("任务编号:" + x + "<br/>");
                        strContent.AppendLine("服务端任务状态:调度中<br/>");
                        strContent.AppendLine("节点端任务状态:任务池中已不存在该任务,调度异常<br/>");
                        AlarmHelper.AlarmAsync(GlobalNodeConfig.NodeInfo.isenablealarm, (AlarmType)GlobalNodeConfig.NodeInfo.alarmtype, GlobalNodeConfig.Alarm, title, strContent.ToString());
                        LogProxy.AddNodeErrorLog(strContent.ToString());
                    }
                });
                if (taskidnotserver.Count > 0)
                {
                    UploadLocalTask(taskidnotserver);
                }
            }
            catch (Exception ex)
            {
                LogProxy.AddNodeErrorLog("节点(" + GlobalNodeConfig.NodeInfo.nodename + "(" + GlobalNodeConfig.NodeInfo.id.ToString() + ")" + ")监控调度中任务异常:" + ex.Message + ",异常:" + JsonConvert.SerializeObject(ex));
                AlarmHelper.AlarmAsync(GlobalNodeConfig.NodeInfo.isenablealarm, (AlarmType)GlobalNodeConfig.NodeInfo.alarmtype, GlobalNodeConfig.Alarm, "节点(" + GlobalNodeConfig.NodeInfo.nodename + "(" + GlobalNodeConfig.NodeInfo.id.ToString() + ")" + ")监控调度中任务异常", JsonConvert.SerializeObject(ex));
            }
        }
コード例 #4
0
 static DataRepository()
 {
     TaskPoolManager.Enqueue(new RecurringTask(() =>
     {
         lock (syncRoot)
         {
             DataContext.Save();
         }
     }, TimeSpan.FromMinutes(5)));
 }
コード例 #5
0
 private void UploadLocalTask(List <int> taskidnotserver)
 {
     taskidnotserver.ForEach(x =>
     {
         var taskruntimeInfo = TaskPoolManager.CreateInstance().Get(x.ToString());
         //上报所在在本地节点运行的任务,但是在服务端未在调度中,更新服务端的任务调度状态为调度中
         var req2 = new UpdateTaskScheduleStatusRequest()
         {
             NodeId = GlobalNodeConfig.NodeID, Source = Source.Node, ScheduleStatus = TaskScheduleStatus.Scheduling, TaskId = x, TaskVersionId = taskruntimeInfo.TaskVersionModel.id, NextRunTime = Convert.ToString(taskruntimeInfo.TaskModel.nextruntime)
         };
         var r3 = NodeProxy.PostToServer <EmptyResponse, UpdateTaskScheduleStatusRequest>(ProxyUrl.UpdateTaskScheduleStatus_Url, req2);
         if (r3.Status != ResponesStatus.Success)
         {
             LogProxy.AddNodeErrorLog("任务id:" + x.ToString() + ",任务名称:" + taskruntimeInfo.TaskModel.taskname + ",在服务端为停止调度状态,在本地节点下为调度中。上报本地节点下的任务状态(调度中)失败");
             // ShowCommandLog("更新任务调度状态(" + status.description() + ")失败,请求Url:" + ProxyUrl.UpdateTaskScheduleStatus_Url + ",请求参数:" + JsonConvert.SerializeObject(req2) + ",返回参数:" + JsonConvert.SerializeObject(r3));
         }
     });
 }
コード例 #6
0
        private static void Main(string[] args)
        {
            InitializePacketLibrary();

            LoadItems();

            WLPrivateServerBootstrapper.Initialize();
            LoginManager.Initialize();

            using (var listener = SocketListener.Create(6414, 50))
            {
                listener.Listen();

                listener.ClientConnected += Listener_ClientConnected;

                Console.Read();

                TaskPoolManager.Stop();
                listener.Close();
            }
        }
コード例 #7
0
 /// <summary>
 /// 执行
 /// </summary>
 public override RunCommandResult Execute()
 {
     try
     {
         string taskid          = CommandQueue.taskid.ToString();
         int    taskversionid   = CommandQueue.taskversionid;
         var    taskruntimeinfo = TaskPoolManager.CreateInstance().Get(taskid.ToString());
         if (taskruntimeinfo == null)
         {
             ShowCommandLog("任务不在运行中");
             //return new RunCommandResult() { RunStatus = CommandRunStatus.Normal };
         }
         else
         {
             var r = TaskDisposer.DisposeTask(CommandQueue.taskid, taskruntimeinfo, false, ShowCommandLog);
         }
         //上报任务已停止日志,并更新任务执行状态和调度状态(待调度)
         var req = new UpdateTaskScheduleStatusRequest()
         {
             NodeId = GlobalNodeConfig.NodeID, Source = Source.Node, ScheduleStatus = Model.enums.TaskScheduleStatus.StopSchedule, TaskId = int.Parse(taskid), TaskVersionId = taskversionid
         };
         var r2 = NodeProxy.PostToServer <EmptyResponse, UpdateTaskScheduleStatusRequest>(ProxyUrl.UpdateTaskScheduleStatus_Url, req);
         if (r2.Status != ResponesStatus.Success)
         {
             ShowCommandLog("更新任务调度状态(停止调度)失败,请求Url:" + ProxyUrl.UpdateTaskScheduleStatus_Url + ",请求参数:" + JsonConvert.SerializeObject(req) + ",返回参数:" + JsonConvert.SerializeObject(r2));
         }
         return(new RunCommandResult()
         {
             ExecuteStatus = ExecuteStatus.ExecuteSucess
         });
     }
     catch (Exception ex)
     {
         ShowCommandLog("停止执行节点任务失败,异常信息:" + JsonConvert.SerializeObject(ex));
         return(new RunCommandResult()
         {
             ExecuteStatus = ExecuteStatus.ExecuteException, Ex = ex, Message = ex.Message
         });
     }
 }
コード例 #8
0
        protected override void Run()
        {
            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.Stop, GlobalConfig.NodeID, onlyTask: true);
            });
            List <int> currentscantaskids = new List <int>();

            foreach (var taskid in taskids)
            {
                try
                {
                    var taskruntimeinfo = TaskPoolManager.CreateInstance().Get(taskid.ToString());
                    if (taskruntimeinfo != null)
                    {
                        currentscantaskids.Add(taskid);
                    }

                    var recovertaskids = (from o in lastscantaskids
                                          from c in currentscantaskids
                                          where o == c
                                          select o).ToList();
                    if (recovertaskids != null && recovertaskids.Count > 0)
                    {
                        recovertaskids.ForEach((c) => {
                            LogHelper.AddTaskError("任务资源运行异常,可能需要手动卸载", taskid, new Exception("任务处于停止状态,但是相应集群节点中,发现任务存在在运行池中未释放"));
                        });
                    }
                    lastscantaskids = currentscantaskids;
                }
                catch (Exception exp)
                {
                    LogHelper.AddNodeError("任务" + taskid + "资源回收出错", exp);
                }
            }
        }
        public override Model.RunCommandResult Execute()
        {
            try
            {
                string taskid          = CommandQueue.taskid.ToString();
                var    taskruntimeinfo = TaskPoolManager.CreateInstance().Get(taskid.ToString());

                if (taskruntimeinfo == null)
                {
                    ShowCommandLog("当前任务不存在于本地节点中,恢复任务调度失败");
                    return(new Model.RunCommandResult()
                    {
                        ExecuteStatus = ExecuteStatus.ExecuteFailed, Message = "当前任务不存在于本地节点中,暂停任务失败"
                    });
                }

                TaskPoolManager.CreateInstance().UpdateTaskSchduleStatus(taskid, TaskScheduleStatus.RecoverSchedule);
                var req = new UpdateTaskScheduleStatusRequest()
                {
                    NodeId = GlobalNodeConfig.NodeID, Source = Source.Node, ScheduleStatus = Model.enums.TaskScheduleStatus.RecoverSchedule, TaskId = int.Parse(taskid), TaskVersionId = taskruntimeinfo.TaskVersionModel.id
                };
                var r2 = NodeProxy.PostToServer <EmptyResponse, UpdateTaskScheduleStatusRequest>(ProxyUrl.UpdateTaskScheduleStatus_Url, req);
                if (r2.Status != ResponesStatus.Success)
                {
                    ShowCommandLog("更新任务调度状态(恢复调度)失败,请求Url:" + ProxyUrl.UpdateTaskScheduleStatus_Url + ",请求参数:" + JsonConvert.SerializeObject(req) + ",返回参数:" + JsonConvert.SerializeObject(r2));
                }
                return(new Model.RunCommandResult()
                {
                    ExecuteStatus = ExecuteStatus.ExecuteSucess
                });
            }
            catch (Exception ex)
            {
                return(new Model.RunCommandResult()
                {
                    ExecuteStatus = ExecuteStatus.ExecuteException, Message = ex.Message, Ex = ex
                });
            }
        }
コード例 #10
0
 public static void Initialize()
 {
     TaskPoolManager.Enqueue(new RecurringTask(Process, TimeSpan.FromMilliseconds(1)));
 }
コード例 #11
0
        /// <summary>
        /// 执行
        /// </summary>
        public override RunCommandResult Execute()
        {
            string taskid        = CommandQueue.taskid.ToString();
            string taskversionid = CommandQueue.taskversionid.ToString();

            try
            {
                var taskruntimeinfo = TaskPoolManager.CreateInstance().Get(taskid.ToString());
                if (taskruntimeinfo != null)
                {
                    ShowCommandLog("任务已在运行中");
                    UploadStatus(taskid, taskversionid, TaskScheduleStatus.Scheduling, "");
                    return(new RunCommandResult()
                    {
                        ExecuteStatus = ExecuteStatus.ExecuteFailed, Message = "任务已在运行中"
                    });
                }
                taskruntimeinfo          = new NodeTaskRunTimeInfo();
                taskruntimeinfo.TaskLock = new TaskLock();
                //读取任务版本信息
                var taskversionreq = new LoadTaskVersionRequest()
                {
                    TaskId = CommandQueue.taskid, TaskVersionId = CommandQueue.taskversionid, Source = Source.Node
                };
                var r = NodeProxy.PostToServer <LoadTaskVersionResponse, LoadTaskVersionRequest>(ProxyUrl.TaskVersionDetail_Url, taskversionreq);
                if (r.Status != ResponesStatus.Success)
                {
                    ShowCommandLog("获取任务版本号详情失败,请求Url:" + ProxyUrl.TaskVersionDetail_Url + ",请求参数:" + JsonConvert.SerializeObject(taskversionreq) + ",返回参数:" + JsonConvert.SerializeObject(r));
                    return(new RunCommandResult()
                    {
                        ExecuteStatus = ExecuteStatus.ExecuteFailed, Message = "获取任务版本号详情失败"
                    });
                }
                taskruntimeinfo.TaskVersionModel = r.Data.TaskVersionDetail;
                taskruntimeinfo.TaskModel        = r.Data.TaskDetail;
                ShowCommandLog("开始创建缓存目录,域安装目录,拷贝共享程序集...");
                string filelocalcachepath = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\') + "\\" + GlobalNodeConfig.TaskDllCompressFileCacheDir + @"\" + taskid + @"\" + r.Data.TaskVersionDetail.version + @"\" + r.Data.TaskVersionDetail.zipfilename;
                string domaininstallpath  = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\') + "\\" + GlobalNodeConfig.TaskDllDir + "\\" + taskid + "\\";
                // string domaininstallmainclassdllpath = domaininstallpath + @"\" + taskruntimeinfo.TaskModel.taskclassname;
                string taskshareddlldir = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\') + "\\" + GlobalNodeConfig.TaskSharedDllsDir;
                //通知节点TaskProvider任务执行
                IOHelper.CreateDirectory(filelocalcachepath);
                IOHelper.CreateDirectory(domaininstallpath);
                File.WriteAllBytes(filelocalcachepath, taskruntimeinfo.TaskVersionModel.zipfile);
                CompressHelper.UnCompress(filelocalcachepath, domaininstallpath);
                IOHelper.CopyDirectory(taskshareddlldir, domaininstallpath);//拷贝共享程序集到域安装路径
                ShowCommandLog("目录操作完成,拷贝共享程序集完成,开始创建任务的AppDomain域");
                try
                {
                    var          dllpath = Path.Combine(domaininstallpath, taskruntimeinfo.TaskVersionModel.zipfilename + ".dll");
                    AbstractTask dllTask = new AppDomainLoaderHelper <AbstractTask>().CreateDomain(dllpath.Replace(".rar", "").Replace("zip", ""), taskruntimeinfo.TaskModel.taskclassname, out taskruntimeinfo.Domain);
                    dllTask.SetAlarmList(r.Data.AlarmEmailList, r.Data.AlarmMobileList);//设置任务报警信息
                    tb_task        cloneTaskModel        = taskruntimeinfo.TaskModel.CloneObj <tb_task>();
                    tb_taskversion cloneTaskVersionModel = taskruntimeinfo.TaskVersionModel.CloneObj <tb_taskversion>();
                    dllTask.TaskDetail        = cloneTaskModel;
                    dllTask.TaskVersionDetail = cloneTaskVersionModel;
                    dllTask.AppConfig         = new TaskAppConfigInfo();

                    //CommandParams cmdparams= JsonConvert.DeserializeObject<CommandParams>(CommandQueue.commandparams);
                    //if (!string.IsNullOrEmpty(cmdparams.TaskParams))
                    //{
                    //    dllTask.AppConfig = JsonConvert.DeserializeObject<TaskAppConfigInfo>(cmdparams.TaskParams);
                    //}
                    //else
                    //{
                    if (!string.IsNullOrEmpty(taskruntimeinfo.TaskVersionModel.taskparams))
                    {
                        dllTask.AppConfig = JsonConvert.DeserializeObject <TaskAppConfigInfo>(taskruntimeinfo.TaskVersionModel.taskparams);
                    }
                    //}
                    taskruntimeinfo.DllTask = dllTask;
                    string nextruntime = "2099-12-30";
                    TaskPoolManager.CreateInstance().Add(taskid.ToString(), taskruntimeinfo, ref nextruntime);
                    ShowCommandLog("加载AppDomain域成功,开始添加到任务池等待执行");
                    //上报任务执行日志,并更新调度状态为调度中
                    UploadStatus(taskid, taskversionid, TaskScheduleStatus.Scheduling, nextruntime);
                    ShowCommandLog("添加到任务池成功,开启任务成功");
                    return(new RunCommandResult()
                    {
                        ExecuteStatus = ExecuteStatus.ExecuteSucess
                    });
                }
                catch (Exception ex)
                {
                    ShowCommandLog("加载任务应用程序域异常,异常信息:" + JsonConvert.SerializeObject(ex));
                    UploadStatus(taskid, taskversionid, TaskScheduleStatus.StopSchedule);
                    return(new RunCommandResult()
                    {
                        ExecuteStatus = ExecuteStatus.ExecuteException, Message = ex.Message, Ex = ex
                    });
                }
            }
            catch (Exception ex)
            {
                ShowCommandLog("开启任务命令异常,异常信息:" + JsonConvert.SerializeObject(ex));
                UploadStatus(taskid, taskversionid, TaskScheduleStatus.StopSchedule);
                return(new RunCommandResult()
                {
                    ExecuteStatus = ExecuteStatus.ExecuteException, Message = ex.Message, Ex = ex
                });
            }
        }
コード例 #12
0
 public void Listen()
 {
     TaskPoolManager.Enqueue(new RecurringTask(Listener, TimeSpan.FromMilliseconds(1)));
 }