예제 #1
0
        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();
        }
예제 #2
0
        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);
        }