示例#1
0
        private void OnDispatchJob(Core.DispatchArg arg)
        {
            ServiceDomainItem servicedomain = null;

            lock (servicelocker)
            {
                servicedomain = serviceItems.FirstOrDefault(x => x.TaskId == arg.TaskId);
                if (servicedomain == null || servicedomain.GetFreeCount() == 0)
                {
                    return;
                }
            }
            //RLib.WatchLog.Loger.Log("分配任务", RLib.Utils.DataSerialize.SerializeJson(arg));
            if (useThreadpoolDispatch)
            {
                System.Threading.ThreadPool.QueueUserWorkItem(x =>
                {
                    _dispatchJobExec(servicedomain, arg);
                });
            }
            else
            {
                System.Threading.Thread t = new System.Threading.Thread(() =>
                {
                    _dispatchJobExec(servicedomain, arg);
                });
                t.IsBackground = true;
                t.Start();
            }
        }
示例#2
0
 private bool _StopWork(int taskId)
 {
     if (!this.serviceItems.ToList().Exists(x => x.TaskId == taskId))
     {
         return(true);
     }
     try
     {
         ServiceDomainItem currtask = null;
         lock (servicelocker)
         {
             currtask = serviceItems.FirstOrDefault(x => x.TaskId == taskId);
             if (currtask == null)
             {
                 return(true);
             }
             currtask.Stop();
             serviceItems.Remove(currtask);
         }
         if (currtask != null && currtask.JobType == 0)
         {
             this.Schedule.StopJob(currtask.JobContext.JobName);
         }
         DoPingSign();
         return(true);
     }
     finally
     {
         _synCacheTask();
     }
 }
示例#3
0
 private bool _innerStart(Ruanal.Core.ApiSdk.TaskDetail taskdetail)
 {
     lock (servicelocker)
     {
         if (serviceItems.Exists(x => x.TaskId == taskdetail.TaskId))
         {
             RLib.WatchLog.Loger.Log("启动任务", "已在运行,无需启动");
             return(true);
         }
         ServiceDomainItem serviceitem = new ServiceDomainItem(taskdetail);
         serviceitem.OnWockComplet += DoGetDispatchSign;
         if (serviceitem.JobType == 0)
         {
             bool setOk = this.Schedule.StartJob(taskdetail.TaskId.ToString(), serviceitem, taskdetail.RunCron);
             if (setOk == false)
             {
                 RLib.WatchLog.Loger.Log("启动任务", "加入计划失败!");
                 return(false);
             }
             var JobContext = this.Schedule.GetJobContext(taskdetail.TaskId.ToString());
             serviceitem.JobContext = JobContext;
         }
         serviceItems.Add(serviceitem);
         RLib.WatchLog.Loger.Log("启动任务", "完成");
         return(true);
     }
 }
示例#4
0
 private void _dispatchJobExec(ServiceDomainItem servicedomain, Core.DispatchArg arg)
 {
     try
     {
         int startStatus = servicedomain.StartDispatch(arg, () =>
         {
             var result = Core.ApiSdk.SystemApi.BeginDispatchExecute(arg.DispatchId);
             if (result.code <= 0)
             {
                 RLib.WatchLog.Loger.Error("开始调度执行失败", arg.DispatchId + "\r\n" + result.msg);
                 return(false);
             }
             //需要检查是否在运行
             if (result.data > 0 && !string.IsNullOrEmpty(arg.RunKey))
             {
                 int[] currDispathIds = null;
                 var isrunning        = servicedomain.IsRuningKey(arg.RunKey, out currDispathIds);
                 if (!isrunning)
                 {
                     isrunning = _AskDispathIsRun(arg.TaskId, arg.RunKey, servicedomain.TaskDetail.NodeCount);
                 }
                 if (isrunning)
                 {
                     Core.ApiSdk.SystemApi.SkipDispatchExecute(arg.DispatchId);
                     DoGetDispatchSign();
                     return(false);
                 }
                 else
                 {
                     //自动结束
                     Core.ApiSdk.SystemApi.AutoEndDispatchExecute(result.data);
                 }
             }
             return(true);
         });
         if (startStatus == -1)
         {
             RLib.WatchLog.Loger.Error("分配任务失败 没有取得空闲实例", "DispatchId=" + arg.DispatchId + " ;RunArgs" + arg.RunArgs);
             return;
         }
         if (startStatus == 0)
         {
             RLib.WatchLog.Loger.Error("分配任务失败 有空闲实例,但分配不允许运行", "DispatchId=" + arg.DispatchId + " ;RunArgs" + arg.RunArgs);
             return;
         }
         Core.ApiSdk.SystemApi.EndDispatchExecute(arg.DispatchId, true, "");
     }
     catch (Exception ex)
     {
         RLib.WatchLog.Loger.Error("调度执行失败", ex);
         Core.ApiSdk.SystemApi.EndDispatchExecute(arg.DispatchId, false, ex.Message);
     }
 }
示例#5
0
        private bool _InnerStopDispatch(int taskId, string invokeid)
        {
            if (!this.serviceItems.ToList().Exists(x => x.TaskId == taskId))
            {
                return(true);
            }
            ServiceDomainItem currtask = null;

            lock (servicelocker)
            {
                currtask = serviceItems.FirstOrDefault(x => x.TaskId == taskId);
                if (currtask == null)
                {
                    return(true);
                }
                var r = currtask.StopDispatch(invokeid);
                if (r == false)
                {
                    throw new Exception("分配不存在或已运行结束!");
                }
            }
            return(true);
        }
示例#6
0
        private string _OnTalk(string msg)
        {
            if (msg.StartsWith(Ruanal.Core.ConfigConst.TalkAskDispatchRunning))
            {
                string[] info = msg.Substring(Ruanal.Core.ConfigConst.TalkAskDispatchRunning.Length).Split(new char[] { '#' }, 2);
                if (info.Length != 2)
                {
                    return(null);
                }
                int               taskId   = RLib.Utils.Converter.StrToInt(info[0]);
                string            runkey   = info[1];
                ServiceDomainItem taskitem = null;
                lock (servicelocker)
                {
                    taskitem = serviceItems.FirstOrDefault(x => x.TaskId == taskId);
                }
                if (taskitem != null)
                {
                    int[] dispathIds = null;
                    if (taskitem.IsRuningKey(runkey, out dispathIds))
                    {
                        return(dispathIds.Length + ":" + string.Join("_", dispathIds));
                    }
                    return("0");
                }
            }
            if (msg.StartsWith(Ruanal.Core.ConfigConst.TalkTaskInstanceStatus))
            {
                string[] info = msg.Substring(Ruanal.Core.ConfigConst.TalkTaskInstanceStatus.Length).Split(new char[] { '#' }, 1);
                if (info.Length != 1)
                {
                    return(null);
                }
                int taskId = RLib.Utils.Converter.StrToInt(info[0]);
                ServiceDomainItem taskitem = null;
                lock (servicelocker)
                {
                    taskitem = serviceItems.FirstOrDefault(x => x.TaskId == taskId);
                }
                if (taskitem != null)
                {
                    string ss = string.Format("【{0}】#{1}", Ruanal.Core.Config.ClientID,
                                              string.Join("#", taskitem.InstanceSummary()));
                    return(ss);
                }
            }

            if (msg.StartsWith(Ruanal.Core.ConfigConst.TalkNodeTaskStatus))
            {
                string[] info = msg.Substring(Ruanal.Core.ConfigConst.TalkNodeTaskStatus.Length).Split(new char[] { '#' }, 1);
                if (info.Length != 1)
                {
                    return(null);
                }
                if (info[0] != Ruanal.Core.Config.ClientID)
                {
                    return(null);
                }
                StringBuilder sb = new StringBuilder();
                foreach (var a in serviceItems.ToList())
                {
                    sb.AppendFormat("【{0}】[P:{1}] [M:{2}] [T:{3}]#", a.TaskId, a.innerServices.Count(), a.GetMemoryMB(), a.TaskDetail.Title);
                }
                return(sb.ToString());
            }
            return(null);
        }