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出错!"); } }
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); }
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)); } }