Exemple #1
0
 public static Trigger CreateTigger(NodeTaskRunTimeInfo taskruntimeinfo)
 {
     if (taskruntimeinfo.TaskVersionModel.taskcron.Contains("["))
     {
         var customcorn = CustomCornFactory.GetCustomCorn(taskruntimeinfo.TaskVersionModel.taskcron);
         customcorn.Parse();
         if (customcorn is SimpleCorn || customcorn is RunOnceCorn)
         {
             var simplecorn = customcorn as SimpleCorn;
             // 定义调度触发规则,比如每1秒运行一次,共运行8次
             SimpleTrigger simpleTrigger = new SimpleTrigger(taskruntimeinfo.TaskModel.id.ToString(), taskruntimeinfo.TaskModel.groupid.ToString());
             if (simplecorn.ConInfo.StartTime != null)
             {
                 simpleTrigger.StartTimeUtc = simplecorn.ConInfo.StartTime.Value.ToUniversalTime();
             }
             //else
             //    simpleTrigger.StartTimeUtc = DateTime.Now.ToUniversalTime();
             if (simplecorn.ConInfo.EndTime != null)
             {
                 simpleTrigger.EndTimeUtc = simplecorn.ConInfo.EndTime.Value.ToUniversalTime();
             }
             if (simplecorn.ConInfo.RepeatInterval != null)
             {
                 simpleTrigger.RepeatInterval = TimeSpan.FromSeconds(simplecorn.ConInfo.RepeatInterval.Value);
             }
             else
             {
                 simpleTrigger.RepeatInterval = TimeSpan.FromSeconds(1);
             }
             if (simplecorn.ConInfo.RepeatCount != null)
             {
                 simpleTrigger.RepeatCount = simplecorn.ConInfo.RepeatCount.Value - 1;//因为任务默认执行一次,所以减一次
             }
             else
             {
                 simpleTrigger.RepeatCount = int.MaxValue;//不填,则默认最大执行次数
             }
             return(simpleTrigger);
         }
         return(null);
     }
     else
     {
         CronTrigger trigger = new CronTrigger(taskruntimeinfo.TaskModel.id.ToString(), taskruntimeinfo.TaskModel.groupid.ToString()); // 触发器名,触发器组
         trigger.CronExpressionString = taskruntimeinfo.TaskVersionModel.taskcron;                                                     // 触发器时间设定
         return(trigger);
     }
 }
Exemple #2
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
                });
            }
        }