Blame view

netcore/src/Infrastructure/NCC/TaskScheduler/Extensions/TaskSchedulerServiceCollectionExtensions.cs 5.86 KB
de2bd2f9   “wangming”   项目初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
  using NCC;
  using NCC.Dependency;
  using NCC.Extensions;
  using NCC.TaskScheduler;
  using System;
  using System.Linq;
  using System.Reflection;
  using System.Threading.Tasks;
  
  namespace Microsoft.Extensions.DependencyInjection
  {
      /// <summary>
      /// 任务调度类服务拓展
      /// </summary>
      [SuppressSniffer]
      public static class TaskSchedulerServiceCollectionExtensions
      {
          /// <summary>
          /// 添加任务调度服务
          /// </summary>
          /// <param name="services"></param>
          /// <returns></returns>
          public static IServiceCollection AddTaskScheduler(this IServiceCollection services)
          {
              // 查找所有贴了 [SpareTime] 特性的方法,并且含有一个参数,参数为 SpareTimer 类型
              var taskMethods = App.EffectiveTypes
                      // 查询符合条件的任务类型
                      .Where(u => u.IsClass && !u.IsInterface && !u.IsAbstract && typeof(ISpareTimeWorker).IsAssignableFrom(u))
                      // 查询符合条件的任务方法
                      .SelectMany(u =>
                          u.GetMethods(BindingFlags.Public | BindingFlags.Instance)
                           .Where(m => m.IsDefined(typeof(SpareTimeAttribute), false)
                                                      && m.GetParameters().Length == 2
                                                      && m.GetParameters()[0].ParameterType == typeof(SpareTimer)
                                                      && m.GetParameters()[1].ParameterType == typeof(long))
                           .GroupBy(m => m.DeclaringType));
  
              if (!taskMethods.Any()) return services;
  
              // 遍历所有的 Worker
              foreach (var item in taskMethods)
              {
                  if (!item.Any()) continue;
  
                  // 创建任务对象
                  var typeInstance = Activator.CreateInstance(item.Key);
  
                  foreach (var method in item)
                  {
                      // 判断是否是异步方法
                      var isAsyncMethod = method.IsAsync();
  
                      // 创建委托类型
                      var action = Delegate.CreateDelegate(isAsyncMethod ? typeof(Func<SpareTimer, long, Task>) : typeof(Action<SpareTimer, long>), typeInstance, method.Name);
  
                      // 获取所有任务特性
                      var spareTimeAttributes = method.GetCustomAttributes<SpareTimeAttribute>();
  
                      // 注册任务
                      foreach (var spareTimeAttribute in spareTimeAttributes)
                      {
                          switch (spareTimeAttribute.Type)
                          {
                              // 执行间隔任务
                              case SpareTimeTypes.Interval:
                                  // 执行一次
                                  if (spareTimeAttribute.DoOnce)
                                  {
                                      if (isAsyncMethod)
                                      {
                                          SpareTime.DoOnce(spareTimeAttribute.Interval, (Func<SpareTimer, long, Task>)action, spareTimeAttribute.WorkerName, spareTimeAttribute.Description, spareTimeAttribute.StartNow, executeType: spareTimeAttribute.ExecuteType);
                                      }
                                      else
                                      {
                                          SpareTime.DoOnce(spareTimeAttribute.Interval, (Action<SpareTimer, long>)action, spareTimeAttribute.WorkerName, spareTimeAttribute.Description, spareTimeAttribute.StartNow, executeType: spareTimeAttribute.ExecuteType);
                                      }
                                  }
                                  // 不间断执行
                                  else
                                  {
                                      if (isAsyncMethod)
                                      {
                                          SpareTime.Do(spareTimeAttribute.Interval, (Func<SpareTimer, long, Task>)action, spareTimeAttribute.WorkerName, spareTimeAttribute.Description, spareTimeAttribute.StartNow, executeType: spareTimeAttribute.ExecuteType);
                                      }
                                      else
                                      {
                                          SpareTime.Do(spareTimeAttribute.Interval, (Action<SpareTimer, long>)action, spareTimeAttribute.WorkerName, spareTimeAttribute.Description, spareTimeAttribute.StartNow, executeType: spareTimeAttribute.ExecuteType);
                                      }
                                  }
                                  break;
                              // 执行 Cron 表达式任务
                              case SpareTimeTypes.Cron:
                                  if (isAsyncMethod)
                                  {
                                      SpareTime.Do(spareTimeAttribute.CronExpression, (Func<SpareTimer, long, Task>)action, spareTimeAttribute.WorkerName, spareTimeAttribute.Description, spareTimeAttribute.StartNow, cronFormat: spareTimeAttribute.CronFormat == default ? default : (CronFormat)spareTimeAttribute.CronFormat, executeType: spareTimeAttribute.ExecuteType);
                                  }
                                  else
                                  {
                                      SpareTime.Do(spareTimeAttribute.CronExpression, (Action<SpareTimer, long>)action, spareTimeAttribute.WorkerName, spareTimeAttribute.Description, spareTimeAttribute.StartNow, cronFormat: spareTimeAttribute.CronFormat == default ? default : (CronFormat)spareTimeAttribute.CronFormat, executeType: spareTimeAttribute.ExecuteType);
                                  }
                                  break;
  
                              default:
                                  break;
                          }
                      }
                  }
              }
  
              return services;
          }
      }
  }