public TimedTaskService(IAssemblyLocator locator, IServiceProvider services) { this.locator = locator; this.services = services; ILoggerFactory loggerFactory = new LoggerFactory() .AddConsole() .AddDebug(); this.logger = loggerFactory.CreateLogger <TimedTaskService>(); //this.logger = services.GetService<ILogger>(); this.timedTaskProvider = services.GetService <ITimedTaskProvider>(); this.timedTaskLogProvider = services.GetService <ITimedTaskProvider>(); var asm = locator.GetAssemblies(); foreach (var x in asm) { //查找带有TimedTaskAttribute的类 var types = x.DefinedTypes.Where(y => y.GetCustomAttribute(typeof(TimedTaskAttribute), true) != null); foreach (var type in types) { JobTypeCollection.Add(type); } } //取得所有方法 foreach (var clazz in JobTypeCollection) { var clazzTimedTaskAttr = clazz.GetCustomAttribute <TimedTaskAttribute>(); var clazzName = string.IsNullOrEmpty(clazzTimedTaskAttr.Name) ? clazz.Name : clazzTimedTaskAttr.Name; foreach (var method in clazz.DeclaredMethods.Where(x => x.GetCustomAttributes <InvokeAttribute>(true).Any())) { //取得所有Invoke配置 var invokes = method.GetCustomAttributes <InvokeAttribute>(true); foreach (var invoke in invokes.Where(i => i.IsEnabled && (i.ExpireTime >= DateTime.Now || i.ExpireTime == default(DateTime)))) { //需要延时的时间 long delta = 0; if (invoke.BeginTime == default(DateTime)) { invoke.BeginTime = DateTime.Now; } else { delta = Convert.ToInt64((invoke.BeginTime - DateTime.Now).TotalMilliseconds); } if (delta < 0) { delta = delta % invoke.Interval; if (delta < 0) { delta += invoke.Interval; } } Task.Factory.StartNew(() => { var invokeName = string.IsNullOrEmpty(invoke.Name) ? method.Name : invoke.Name; var task = new TimedTask(); task.Id = CryptHelper.EncryptMD5(clazzName + "." + invokeName); task.Name = clazzName + "." + invokeName; task.Identifier = clazz.FullName + "." + method.Name; task.BeginTime = invoke.BeginTime; task.ExpireTime = invoke.ExpireTime; task.Interval = invoke.Interval; task.AutoReset = invoke.AutoReset; task.IsEnabled = invoke.IsEnabled; var deltaSpan = new TimeSpan(delta * 10000); var IntervalSpan = new TimeSpan((invoke.AutoReset ? invoke.Interval : 0) * 10000); var timer = new Timer(t => { Execute(task, clazz, method); }, null, deltaSpan, IntervalSpan); StaticTimers.Add(task.Id, timer); }); } } } ExecuteDbTask(); }
private bool Execute(TimedTask task, TypeInfo clazz, MethodInfo method) { var identifier = task.Identifier; if (task.ExpireTime != default(DateTime) && task.ExpireTime <= DateTime.Now) { //已过期失效 StaticTimers[task.Id].Dispose(); TaskStatus[task.Id] = false; StaticTimers.Remove(task.Id); TaskStatus.Remove(task.Id); return(false); } var argtypes = clazz.GetConstructors() .First() .GetParameters() .Select(x => { if (x.ParameterType == typeof(IServiceProvider)) { return(services); } else { return(services.GetService(x.ParameterType)); } }).ToArray(); var instance = Activator.CreateInstance(clazz.AsType(), argtypes); var paramtypes = method.GetParameters().Select(x => services.GetService(x.ParameterType)).ToArray(); var singleTaskAttr = method.GetCustomAttribute <SingleTaskAttribute>(true); lock (this) { if (!IsEnable) { return(false); } if (singleTaskAttr != null && singleTaskAttr.IsSingleTask && TaskStatus.ContainsKey(task.Id) && TaskStatus[task.Id]) { return(false); } TaskStatus[task.Id] = true; } var dtStart = DateTime.Now; try { if (IsZh) { logger?.LogInformation($"[事务]{task.Name} 开始执行..."); } else { logger?.LogInformation($"[Task]{task.Name} Invoking..."); } Stopwatch sw = new Stopwatch(); sw.Start(); method.Invoke(instance, paramtypes); sw.Stop(); var dtEnd = DateTime.Now; if (IsZh) { logger?.LogInformation($"[事务]{task.Name} 执行结束,耗时{sw.ElapsedMilliseconds}毫秒。"); } else { logger?.LogInformation($"[Task]{task.Name} Finish, takes {sw.ElapsedMilliseconds} milliseconds."); } Debug.WriteLine($"[Task]{task.Name} Finish, takes {sw.ElapsedMilliseconds} milliseconds."); //写数据库log if (timedTaskLogProvider != null) { Task.Factory.StartNew(() => { TimedTaskLog log = new TimedTaskLog(); log.TaskId = task.Id; log.BeginTime = dtStart; log.EndTime = dtEnd; log.Duration = sw.ElapsedMilliseconds; log.Result = "success"; timedTaskLogProvider.AddLog(log); }); } } catch (Exception ex) { if (timedTaskLogProvider != null) { Task.Factory.StartNew(() => { TimedTaskLog log = new TimedTaskLog(); log.TaskId = task.Id; log.BeginTime = dtStart; log.EndTime = DateTime.Now; log.Duration = Convert.ToInt64((dtStart - DateTime.Now).TotalMilliseconds); log.Result = "fail"; timedTaskLogProvider.AddLog(log); }); } logger?.LogError(ex.ToString()); } TaskStatus[task.Id] = false; return(true); }