private static void Start(Task task, AppDomain domain) { //throw new SchedulerException("SchedulerException"); //在应用程序域中创建实例返回并保存在job中,这是最终调用任务执行的实例 TaskBase instance = domain.CreateInstanceFromAndUnwrap(AssemblyHelper.GetTaskAssemblyPath(task.AssemblyName), task.ClassName) as TaskBase; if (instance == null) { throw new InvalidCastException($"任务实例创建失败,请确认目标任务是否派生自TaskBase类型。程序集:{task.AssemblyName},类型:{task.ClassName}"); } // instance.logger = new LogWriter(); ; JobDataMap map = new JobDataMap { new KeyValuePair <string, object> ("domain", domain), new KeyValuePair <string, object> ("instance", instance), new KeyValuePair <string, object> ("name", task.Title), new KeyValuePair <string, object> ("params", task.CustomParamsJson) }; string jobName = task.Id.ToString().ToLower(); IJobDetail job = JobBuilder.Create(typeof(RootJob)).WithIdentity(jobName) .SetJobData(map) //.UsingJobData("assembly", task.AssemblyName) //.UsingJobData("class", task.ClassName) .Build(); //添加触发器 _scheduler.ListenerManager.AddJobListener(new JobRunListener(jobName), KeyMatcher <JobKey> .KeyEquals(new JobKey(jobName))); if (task.RunMoreTimes) { if (!CronExpression.IsValidExpression(task.CronExpression)) { throw new Exception("cron表达式验证失败"); } CronTriggerImpl trigger = new CronTriggerImpl { CronExpressionString = task.CronExpression, Name = task.Title, Key = new TriggerKey(task.Id.ToString()), Description = task.Remark }; if (task.StartDate.HasValue) { trigger.StartTimeUtc = TimeZoneInfo.ConvertTimeToUtc(task.StartDate.Value); } if (task.EndDate.HasValue) { trigger.EndTimeUtc = TimeZoneInfo.ConvertTimeToUtc(task.EndDate.Value); } _scheduler.ScheduleJob(job, trigger); } else { DateTimeOffset start = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now); if (task.StartDate.HasValue) { start = TimeZoneInfo.ConvertTimeToUtc(task.StartDate.Value); } DateTimeOffset end = start.AddMinutes(1); if (task.EndDate.HasValue) { end = TimeZoneInfo.ConvertTimeToUtc(task.EndDate.Value); } ITrigger trigger = TriggerBuilder.Create() .WithIdentity(jobName) .StartAt(start) .WithSimpleSchedule(x => x .WithRepeatCount(1).WithIntervalInMinutes(1)) .EndAt(end) .Build(); _scheduler.ScheduleJob(job, trigger); } LogHelper.Info($"任务\"{task.Title}\"启动成功!", task.Id); System.Threading.Tasks.Task.Run(() => { while (true) { var log = instance.ReadLog(); if (log != null) { //System.Diagnostics.Debug.WriteLine("queue:" + log.Contents); LogManager.Queue.Write(log); } else { System.Threading.Thread.Sleep(3000); } } }); }
private static async Task Start(ScheduleView view, PluginLoadContext lc, Action <Guid, DateTime?> callBack) { //throw new SchedulerException("SchedulerException"); //在应用程序域中创建实例返回并保存在job中,这是最终调用任务执行的实例 TaskBase instance = AssemblyHelper.CreateTaskInstance(lc, view.Schedule.Id, view.Schedule.AssemblyName, view.Schedule.ClassName); if (instance == null) { throw new InvalidCastException($"任务实例创建失败,请确认目标任务是否派生自TaskBase类型。程序集:{view.Schedule.AssemblyName},类型:{view.Schedule.ClassName}"); } // instance.logger = new LogWriter(); ; JobDataMap map = new JobDataMap { new KeyValuePair <string, object> ("domain", lc), new KeyValuePair <string, object> ("instance", instance), new KeyValuePair <string, object> ("name", view.Schedule.Title), new KeyValuePair <string, object> ("params", ConvertParamsJson(view.Schedule.CustomParamsJson)), new KeyValuePair <string, object> ("keepers", view.Keepers), new KeyValuePair <string, object> ("children", view.Children) }; IJobDetail job = JobBuilder.Create <RootJob>() .WithIdentity(view.Schedule.Id.ToString()) .UsingJobData(map) //.UsingJobData("assembly", task.AssemblyName) //.UsingJobData("class", task.ClassName) .Build(); //添加触发器 _scheduler.ListenerManager.AddJobListener(new JobRunListener(view.Schedule.Id.ToString(), callBack), KeyMatcher <JobKey> .KeyEquals(new JobKey(view.Schedule.Id.ToString()))); if (view.Schedule.RunLoop) { if (!CronExpression.IsValidExpression(view.Schedule.CronExpression)) { throw new Exception("cron表达式验证失败"); } CronTriggerImpl trigger = new CronTriggerImpl { CronExpressionString = view.Schedule.CronExpression, Name = view.Schedule.Title, Key = new TriggerKey(view.Schedule.Id.ToString()), Description = view.Schedule.Remark }; if (view.Schedule.StartDate.HasValue) { trigger.StartTimeUtc = TimeZoneInfo.ConvertTimeToUtc(view.Schedule.StartDate.Value); } if (view.Schedule.EndDate.HasValue) { trigger.EndTimeUtc = TimeZoneInfo.ConvertTimeToUtc(view.Schedule.EndDate.Value); } await _scheduler.ScheduleJob(job, trigger); } else { DateTimeOffset start = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now); if (view.Schedule.StartDate.HasValue) { start = TimeZoneInfo.ConvertTimeToUtc(view.Schedule.StartDate.Value); } DateTimeOffset end = start.AddMinutes(1); if (view.Schedule.EndDate.HasValue) { end = TimeZoneInfo.ConvertTimeToUtc(view.Schedule.EndDate.Value); } ITrigger trigger = TriggerBuilder.Create() .WithIdentity(view.Schedule.Id.ToString()) .StartAt(start) .WithSimpleSchedule(x => x .WithRepeatCount(1).WithIntervalInMinutes(1)) .EndAt(end) .Build(); await _scheduler.ScheduleJob(job, trigger); } LogHelper.Info($"任务[{view.Schedule.Title}]启动成功!", view.Schedule.Id); _ = Task.Run(() => { while (true) { var log = instance.ReadLog(); if (log != null) { LogManager.Queue.Write(new SystemLogEntity { Category = log.Category, Message = log.Message, ScheduleId = log.ScheduleId, Node = log.Node, StackTrace = log.StackTrace, TraceId = log.TraceId, CreateTime = log.CreateTime }); } else { Thread.Sleep(3000); } } }); }