Exemplo n.º 1
0
        private static async Task Start(IHosSchedule schedule)
        {
            JobDataMap map = new JobDataMap
            {
                new KeyValuePair <string, object> ("instance", schedule),
            };
            string jobKey = schedule.Main.Id.ToString();

            try
            {
                IJobDetail job = JobBuilder.Create().OfType(schedule.GetQuartzJobType()).WithIdentity(jobKey).UsingJobData(map).Build();

                //添加监听器
                var listener = new JobRunListener(jobKey);
                listener.OnSuccess += StartedEvent;
                _scheduler.ListenerManager.AddJobListener(listener, KeyMatcher <JobKey> .KeyEquals(new JobKey(jobKey)));

                await _scheduler.ScheduleJob(job, GetTrigger(schedule.Main), schedule.CancellationTokenSource.Token);
            }
            catch (Exception ex)
            {
                throw new SchedulerException(ex);
            }
            LogHelper.Info($"任务[{schedule.Main.Title}]启动成功!", schedule.Main.Id);

            _ = Task.Run(() =>
            {
                while (true)
                {
                    if (schedule.RunnableInstance == null)
                    {
                        break;
                    }
                    var log = schedule.RunnableInstance.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);
                    }
                }
            });
        }
Exemplo n.º 2
0
        private static async Task Start(IHosSchedule schedule)
        {
            JobDataMap map = new JobDataMap
            {
                new KeyValuePair <string, object> ("instance", schedule),
            };
            string jobKey = schedule.Main.Id.ToString();

            try
            {
                IJobDetail job = JobBuilder.Create().OfType(schedule.GetQuartzJobType()).WithIdentity(jobKey).UsingJobData(map).Build();

                //添加监听器
                var listener = new JobRunListener(jobKey);
                listener.OnSuccess += StartedEvent;
                _scheduler.ListenerManager.AddJobListener(listener, KeyMatcher <JobKey> .KeyEquals(new JobKey(jobKey)));

                ITrigger trigger = GetTrigger(schedule.Main);
                await _scheduler.ScheduleJob(job, trigger, schedule.CancellationTokenSource.Token);

                using (var scope = new Core.ScopeDbContext())
                {
                    var db   = scope.GetDbContext();
                    var task = db.Schedules.FirstOrDefault(x => x.Id == schedule.Main.Id);
                    if (task != null)
                    {
                        task.NextRunTime = TimeZoneInfo.ConvertTimeFromUtc(trigger.GetNextFireTimeUtc().Value.UtcDateTime, TimeZoneInfo.Local);
                        await db.SaveChangesAsync();
                    }
                }
            }
            catch (Exception ex)
            {
                throw new SchedulerException(ex);
            }
            LogHelper.Info($"任务[{schedule.Main.Title}]启动成功!", schedule.Main.Id);

            _ = Task.Run(async() =>
            {
                while (true)
                {
                    if (schedule.RunnableInstance == null)
                    {
                        break;
                    }
                    var log = schedule.RunnableInstance.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
                    {
                        await Task.Delay(3000);
                    }
                }
            });
        }
Exemplo n.º 3
0
        private static async Task Start(ScheduleView view, PluginLoadContext lc)
        {
            //throw

            //在应用程序域中创建实例返回并保存在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)
            };

            try
            {
                IJobDetail job = JobBuilder.Create <RootJob>()
                                 .WithIdentity(view.Schedule.Id.ToString())
                                 .UsingJobData(map)
                                 .Build();

                //添加触发器
                var listener = new JobRunListener(view.Schedule.Id.ToString());
                listener.OnSuccess += StartedEvent;
                _scheduler.ListenerManager.AddJobListener(listener, 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);
                }
            }
            catch (Exception ex)
            {
                throw new SchedulerException(ex);
            }
            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);
                    }
                }
            });
        }