コード例 #1
0
        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);
                    }
                }
            });
        }
コード例 #2
0
        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);
                    }
                }
            });
        }