/// <summary> /// 运行任务 /// </summary> /// <param name="stoppingToken"></param> /// <returns></returns> protected override Task ExecuteAsync(CancellationToken stoppingToken) { TaskServicesManager.GetOrAdd("Clear Upload Files", token => { if (_env != null) { var webSiteUrl = $"images{Path.DirectorySeparatorChar}uploader{Path.DirectorySeparatorChar}"; var filePath = Path.Combine(_env.WebRootPath, webSiteUrl); if (Directory.Exists(filePath)) { Directory.EnumerateFiles(filePath).Take(10).ToList().ForEach(file => { try { if (token.IsCancellationRequested) { return; } File.Delete(file); } catch { } }); } } return(Task.CompletedTask); }, TriggerBuilder.Build(Cron.Minutely(10))); return(Task.CompletedTask); }
public bool Post([FromBody] TaskWidget widget) { // 判断 Cron 表达式 if (string.IsNullOrEmpty(widget.CronExpression)) { return(false); } // 系统内置任务禁止更改 // 演示模式下禁止删除内置任务 if (DictHelper.RetrieveSystemModel() && _tasks.Any(t => t.Equals(widget.Name, StringComparison.OrdinalIgnoreCase))) { return(false); } // 加载任务执行体 // 此处可以扩展为任意 DLL 中的任意继承 ITask 接口的实体类 var taskExecutor = LgbActivator.CreateInstance <ITask>("Bootstrap.Admin", widget.TaskExecutorName); if (taskExecutor == null) { return(false); } // 此处未存储到数据库中,直接送入任务中心 TaskServicesManager.Remove(widget.Name); TaskServicesManager.GetOrAdd(widget.Name, token => taskExecutor.Execute(token), TriggerBuilder.Build(widget.CronExpression)); return(true); }
/// <summary> /// 运行任务 /// </summary> /// <param name="stoppingToken"></param> /// <returns></returns> protected override Task ExecuteAsync(CancellationToken stoppingToken) => Task.Run(() => { TaskServicesManager.GetOrAdd("单次任务", token => Task.Delay(1000)); TaskServicesManager.GetOrAdd("周期任务", token => Task.Delay(1000), TriggerBuilder.Default.WithInterval(10000).Build()); TaskServicesManager.GetOrAdd("Cron 任务", token => Task.Delay(1000), TriggerBuilder.Build(Cron.Secondly(5))); TaskServicesManager.GetOrAdd("超时任务", token => Task.Delay(2000), TriggerBuilder.Default.WithTimeout(1000).WithInterval(1000).WithRepeatCount(2).Build()); // 本机调试时此处会抛出异常,配置文件中默认开启了任务持久化到物理文件,此处异常只有首次加载时会抛出 // 此处异常是示例自定义任务内部未进行捕获异常时任务仍然能继续运行,不会导致整个进程崩溃退出 // 此处代码可注释掉 //TaskServicesManager.GetOrAdd("故障任务", token => throw new Exception("故障任务")); TaskServicesManager.GetOrAdd("取消任务", token => Task.Delay(1000)).Triggers.First().Enabled = false; // 创建任务并禁用 TaskServicesManager.GetOrAdd("禁用任务", token => Task.Delay(1000)).Status = SchedulerStatus.Disabled; // 真实任务负责批次写入数据执行脚本到日志中 TaskServicesManager.GetOrAdd <DBLogTask>("SQL日志", TriggerBuilder.Build(Cron.Minutely())); // 真实人物负责周期性设置健康检查结果开关为开启 TaskServicesManager.GetOrAdd("健康检查", token => Task.FromResult(DictHelper.SaveSettings(new BootstrapDict[] { new BootstrapDict() { Category = "网站设置", Name = "健康检查", Code = "1", Define = 0 } })), TriggerBuilder.Build(Cron.Minutely(10))); });
/// <summary> /// 运行任務 /// </summary> /// <param name="stoppingToken"></param> /// <returns></returns> protected override Task ExecuteAsync(CancellationToken stoppingToken) => Task.Run(() => { TaskServicesManager.GetOrAdd("單次任務", token => Task.Delay(1000)); TaskServicesManager.GetOrAdd("周期任務", token => Task.Delay(1000), TriggerBuilder.Default.WithInterval(10000).Build()); TaskServicesManager.GetOrAdd("Cron 任務", token => Task.Delay(1000), TriggerBuilder.Build(Cron.Secondly(5))); TaskServicesManager.GetOrAdd("超時任務", token => Task.Delay(2000), TriggerBuilder.Default.WithTimeout(1000).WithInterval(1000).WithRepeatCount(2).Build()); // 本機調試時此處會抛出異常,配置文件中預設开啟了任務持久化到物理文件,此處異常只有首次加載時會抛出 // 此處異常是示例自定义任務内部未進行捕獲異常時任務仍然能继续运行,不會導致整個進程崩溃退出 // 此處程式碼可注释掉 //TaskServicesManager.GetOrAdd("故障任務", token => throw new Exception("故障任務")); TaskServicesManager.GetOrAdd("取消任務", token => Task.Delay(1000)).Triggers.First().Enabled = false; // 創建任務并禁用 TaskServicesManager.GetOrAdd("禁用任務", token => Task.Delay(1000)).Status = SchedulerStatus.Disabled; // 真實任務负责批次写入資料執行腳本到日誌中 TaskServicesManager.GetOrAdd <DBLogTask>("SQL日誌", TriggerBuilder.Build(Cron.Minutely())); // 真實人物负责周期性設置健康檢查结果开關為开啟 TaskServicesManager.GetOrAdd("健康檢查", token => Task.FromResult(DictHelper.SaveSettings(new BootstrapDict[] { new BootstrapDict() { Category = "網站設置", Name = "健康檢查", Code = "1", Define = 0 } })), TriggerBuilder.Build(Cron.Minutely(10))); });
public ActionResult Get([FromQuery] string name, [FromServices] IHubContext <TaskLogHub> hub) { var sche = TaskServicesManager.Get(name); sche.Triggers.First().PulseCallback = t => SendTaskLog(sche, name, hub); SendTaskLog(sche, name, hub); return(Ok(true)); }
public bool Delete([FromBody] IEnumerable <string> ids) { // 演示模式下禁止删除内置任务 if (DictHelper.RetrieveSystemModel() && _tasks.Any(t => ids.Any(id => id.Equals(t, StringComparison.OrdinalIgnoreCase)))) { return(false); } // 循环删除任务 ids.ToList().ForEach(id => TaskServicesManager.Remove(id)); return(true); }
/// <summary> /// 运行任务 /// </summary> /// <param name="stoppingToken"></param> /// <returns></returns> protected override Task ExecuteAsync(CancellationToken stoppingToken) => Task.Run(() => { TaskServicesManager.GetOrAdd("单次任务", token => Task.Delay(1000)); TaskServicesManager.GetOrAdd("周期任务", token => Task.Delay(1000), TriggerBuilder.Default.WithInterval(10000).Build()); TaskServicesManager.GetOrAdd("Cron 任务", token => Task.Delay(1000), TriggerBuilder.Build(Cron.Secondly(5))); TaskServicesManager.GetOrAdd("超时任务", token => Task.Delay(2000), TriggerBuilder.Default.WithTimeout(1000).WithInterval(1000).WithRepeatCount(2).Build()); // 本机调试时此处会抛出异常,配置文件中默认开启了任务持久化到物理文件,此处异常只有首次加载时会抛出 // 此处异常是示例自定义任务内部未进行捕获异常时任务仍然能继续运行,不会导致整个进程崩溃退出 // 此处代码可注释掉 //TaskServicesManager.GetOrAdd("故障任务", token => throw new Exception("故障任务")); TaskServicesManager.GetOrAdd("取消任务", token => Task.Delay(1000)).Triggers.First().Enabled = false; // 创建任务并禁用 TaskServicesManager.GetOrAdd("禁用任务", token => Task.Delay(1000)).Status = SchedulerStatus.Disabled; // 真实任务负责批次写入数据执行脚本到日志中 TaskServicesManager.GetOrAdd <DBLogTask>("SQL日志", TriggerBuilder.Build(Cron.Minutely())); });
/// <summary> /// 資料查詢方法 /// </summary> /// <param name="options"></param> /// <returns></returns> protected QueryData <DefaultScheduler> Query(QueryPageOptions options) { var data = (string.IsNullOrEmpty(options.SearchText) ? TaskServicesManager.ToList() : TaskServicesManager.ToList().Where(t => t.Name.Contains(options.SearchText, StringComparison.OrdinalIgnoreCase))).OrderBy(s => s.Name).Select(s => new DefaultScheduler() { Name = s.Name, Status = s.Status, NextRuntime = s.NextRuntime, CreatedTime = s.CreatedTime, Triggers = s.Triggers, LastRuntime = s.LastRuntime, LastRunResult = s.Triggers.First().LastResult, TriggerExpression = s.Triggers.First()?.ToString() ?? "" }); return(new QueryData <DefaultScheduler>() { Items = data, TotalCount = data.Count(), PageIndex = 1, PageItems = data.Count() }); }
public bool Put(string scheName, [FromQuery] string operType) { var sche = TaskServicesManager.Get(scheName); if (sche != null) { sche.Status = operType == "pause" ? SchedulerStatus.Disabled : SchedulerStatus.Running; } // SQL 日志任务特殊处理 if (scheName == "SQL日志") { if (operType == "pause") { DBLogTask.Pause(); } else { DBLogTask.Run(); } } return(true); }
public IEnumerable <object> Get() { return(TaskServicesManager.ToList().Select(s => new { s.Name, Status = s.Status.ToString(), s.LastRuntime, s.CreatedTime, s.NextRuntime, LastRunResult = s.Triggers.First().LastResult.ToString(), TriggerExpression = s.Triggers.First().ToString() }).OrderBy(s => s.Name)); }
public object Get() { if (!User.IsInRole("Administrators")) { return(false); } // New Users var user = UserHelper.RetrieveNewUsers(); var usersCount = user.Count(); user = user.Take(6); user.AsParallel().ForAll(n => { var ts = DateTime.Now - n.RegisterTime; if (ts.TotalMinutes < 5) { n.Period = "刚刚"; } else if (ts.Days > 0) { n.Period = string.Format("{0}天", ts.Days); } else if (ts.Hours > 0) { n.Period = string.Format("{0}小时", ts.Hours); } else if (ts.Minutes > 0) { n.Period = string.Format("{0}分钟", ts.Minutes); } }); // Tasks var task = TaskServicesManager.ToList().Where(s => s.NextRuntime != null).Select(s => new { s.Name, s.LastRuntime, s.LastRunResult }); var tasksCount = task.Count(); //Message var message = MessageHelper.Retrieves(User.Identity.Name); var messagesCount = message.Count(); message = message.Take(6); message.AsParallel().ForAll(m => m.FromIcon = Url.Content(m.FromIcon)); //Apps var apps = ExceptionsHelper.Retrieves().Where(n => n.Category != "DB"); var appExceptionsCount = apps.Count(); apps = apps.Take(6); apps.AsParallel().ForAll(n => { n.ExceptionType = n.ExceptionType.Split('.').Last(); var ts = DateTime.Now - n.LogTime; if (ts.TotalMinutes < 5) { n.Period = "刚刚"; } else if (ts.Days > 0) { n.Period = string.Format("{0}天", ts.Days); } else if (ts.Hours > 0) { n.Period = string.Format("{0}小时", ts.Hours); } else if (ts.Minutes > 0) { n.Period = string.Format("{0}分钟", ts.Minutes); } }); //Dbs var dbs = ExceptionsHelper.Retrieves().Where(n => n.Category == "DB"); var dbExceptionsCount = dbs.Count(); dbs = dbs.Take(6); dbs.AsParallel().ForAll(n => { var ts = DateTime.Now - n.LogTime; if (ts.TotalMinutes < 5) { n.Period = "刚刚"; } else if (ts.Days > 0) { n.Period = string.Format("{0}天", ts.Days); } else if (ts.Hours > 0) { n.Period = string.Format("{0}小时", ts.Hours); } else if (ts.Minutes > 0) { n.Period = string.Format("{0}分钟", ts.Minutes); } }); return(new { NewUsersCount = usersCount, TasksCount = tasksCount, MessagesCount = messagesCount, AppExceptionsCount = appExceptionsCount, DbExceptionsCount = dbExceptionsCount, Users = user.Select(i => new { i.Period, i.UserName, i.DisplayName, i.Description }), Tasks = task.Take(6), Messages = message, Apps = apps.Select(n => new { n.ExceptionType, n.Message, n.Period }), Dbs = dbs.Select(n => new { n.ErrorPage, n.Message, n.Period }) }); }