Exemple #1
0
 public DispatchWork(Ruanal.Core.ApiSdk.TaskDetail taskdetail)
 {
     this.TaskDetail = taskdetail;
     TaskId          = this.TaskDetail.TaskId;
     if (string.IsNullOrEmpty(TaskDetail.DispatchClass))
     {
         _dispatchbase = new EntDispatcher();
         TaskVersion   = taskdetail.CurrVersionId;
     }
     else
     {
         _dispatchbase = GetDispatcher();
         if (_dispatchbase == null)
         {
             throw new Exception("调度器初始化失败!");
         }
     }
     try
     {
         if (!string.IsNullOrWhiteSpace(TaskDetail.TaskConfig))
         {
             _dispatchbase.TaskConfig = RLib.Utils.DataSerialize.DeserializeObject <Dictionary <string, string> >(TaskDetail.TaskConfig);
         }
         else
         {
             _dispatchbase.TaskConfig = new Dictionary <string, string>();
         }
     }
     catch (Exception ex)
     {
         throw new Exception("任务配置json出错!");
     }
 }
Exemple #2
0
        private Ruanal.Job.DispatcherBase GetDispatcher()
        {
            Ruanal.Job.DispatcherBase item = null;
            bool   existdll    = false;
            string dirtask     = Ruanal.Core.Config.GetTaskItemDir(TaskDetail.TaskId);
            string dllname     = dirtask.TrimEnd('\\') + TaskDetail.EnterDll;
            string versionFile = System.IO.Path.Combine(dirtask, Ruanal.Core.ConfigConst.TaskVersionFileName);

            if (System.IO.File.Exists(dllname))
            {
                existdll = true;
            }
            else
            {
                var file = Ruanal.Core.ApiSdk.SystemApi.DownloadFile2(TaskDetail.FileUrl);
                if (file.code > 0)
                {
                    string filename = Ruanal.Core.Config.GetTempFileName();
                    System.IO.File.WriteAllBytes(filename, file.data);
                    Ruanal.Core.Utils.Utils.UnZip(filename, dirtask, "", true);
                    System.IO.File.WriteAllText(versionFile, TaskDetail.CurrVersionId.ToString());
                    Ruanal.Core.Utils.Utils.DeleteFileOrDir(filename);
                    if (System.IO.File.Exists(dllname))
                    {
                        existdll = true;
                    }
                }
            }
            if (existdll == false)
            {
                return(null);
            }
            //当前版本
            try
            {
                TaskVersion = RLib.Utils.Converter.StrToInt(
                    System.IO.File.ReadAllText(versionFile)
                    );
            }
            catch { }
            var dllas     = Assembly.LoadFile(dllname);
            var typeofdis = dllas.GetType(TaskDetail.DispatchClass, false, true);

            if (typeofdis != null)
            {
                object instance = Activator.CreateInstance(typeofdis);
                item = instance as Ruanal.Job.DispatcherBase;
            }
            return(item);
        }
Exemple #3
0
        private void _GetDispatcher()
        {
            AppDomainSetup setup = new AppDomainSetup();

            setup.ApplicationBase = _taskDir;
            setup.ShadowCopyFiles = "true";
            if (!string.IsNullOrWhiteSpace(Core.ConfigConst.JobBin))
            {
                setup.PrivateBinPath = Core.ConfigConst.JobBin;
            }
            string appconfigfile  = System.IO.Path.Combine(_taskDir, "App.config");
            string appconfigfile2 = System.IO.Path.Combine(_taskDir, TaskDetail.EnterDll + ".config");

            if (System.IO.File.Exists(appconfigfile))
            {
                setup.ConfigurationFile = appconfigfile;
            }
            if (System.IO.File.Exists(appconfigfile2))
            {
                setup.ConfigurationFile = appconfigfile2;
            }
            AppDomain.MonitoringIsEnabled = true;
            _taskDomain = AppDomain.CreateDomain("task_" + TaskDetail.TaskId, null, setup);
            Core.DomainAssembleLoader.ConfigLoad(_taskDomain);
            var taskConfig = BuildTaskConfig();

            List <string> trydisclass         = new List <string>();
            object        obj_serviceinstance = null;

            _dispatchClass = "";

            var nolink = Ruanal.Job.DispatchProxy.IsNoLink(_enterDll, TaskDetail.DispatchClass);

            _noLink = nolink;
            if (nolink)
            {
                _enterDll = System.IO.Path.Combine(_jobBinDir, "Ruanal.Job.dll");
                trydisclass.Add("Ruanal.Job.DispatchProxy");
            }
            else
            {
                if (TaskDetail.DispatchClass.IndexOf('.') > 0)
                {
                    trydisclass.Add(TaskDetail.DispatchClass);
                }
                else
                {
                    trydisclass.Add(TaskDetail.DispatchClass);
                    var indexext = TaskDetail.EnterDll.LastIndexOf('.');
                    var sub      = indexext > 0 ? TaskDetail.EnterDll.Substring(0, indexext) : TaskDetail.EnterDll;
                    sub += ".";
                    trydisclass.Add(sub + TaskDetail.DispatchClass);
                    trydisclass.Add(sub + "ImpDispatchs." + TaskDetail.DispatchClass);
                    trydisclass.Add(sub + "Dispatchs." + TaskDetail.DispatchClass);
                }
            }
            foreach (var a in trydisclass)
            {
                try
                {
                    obj_serviceinstance = _taskDomain.CreateInstanceFromAndUnwrap(_enterDll, a);
                    if (obj_serviceinstance != null)
                    {
                        _dispatchClass = a;
                        break;
                    }
                    break;
                }
                catch (Exception ex)
                {
                    continue;
                }
            }
            if (obj_serviceinstance == null)
            {
                throw new Exception("调度器" + TaskDetail.DispatchClass + "不存在!,查找位置:" + string.Join(",", trydisclass));
            }
            if (obj_serviceinstance is Ruanal.Job.DispatcherBase)
            {
                var currinstance = obj_serviceinstance as Ruanal.Job.DispatcherBase;
                //string InstanceId = Guid.NewGuid().ToString().Replace("-", "");
                //currinstance.GlobalInit(RLib.Utils.DataSerialize.SerializeJson(taskConfig));
                //var crosslog = new Job.CrossLoger(InstanceId, ServiceLogHandler);
                //currinstance.Loger = crosslog;
                //currinstance.Init();
                _dispatchbase = currinstance;
            }
            else
            {
                throw new Exception(string.Format("类型{0}不是{1}类型", TaskDetail.EnterClass, typeof(Ruanal.Job.JobServiceBase).Name));
            }
        }