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; }
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)); } } }
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)); } }
static DataRepository() { TaskPoolManager.Enqueue(new RecurringTask(() => { lock (syncRoot) { DataContext.Save(); } }, TimeSpan.FromMinutes(5))); }
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)); } }); }
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(); } }
/// <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 }); } }
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 }); } }
public static void Initialize() { TaskPoolManager.Enqueue(new RecurringTask(Process, TimeSpan.FromMilliseconds(1))); }
/// <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 }); } }
public void Listen() { TaskPoolManager.Enqueue(new RecurringTask(Listener, TimeSpan.FromMilliseconds(1))); }