Преглед изворни кода

升级Furion v4.8.1.2 完善定时任务相关

zuohuaijun пре 3 година
родитељ
комит
4901e68dd6

+ 4 - 4
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -14,9 +14,9 @@
   <ItemGroup>
     <PackageReference Include="AngleSharp" Version="0.17.1" />
     <PackageReference Include="AspNetCoreRateLimit" Version="4.0.2" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.1" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.1" />
-    <PackageReference Include="Furion.Pure" Version="4.8.1" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.8.1.2" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.8.1.2" />
+    <PackageReference Include="Furion.Pure" Version="4.8.1.2" />
     <PackageReference Include="Lazy.Captcha.Core" Version="1.1.6" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.7.0" />
     <PackageReference Include="Magicodes.IE.Pdf" Version="2.7.0" />
@@ -26,7 +26,7 @@
     <PackageReference Include="NewLife.Redis" Version="5.0.2022.1101" />
     <PackageReference Include="OnceMi.AspNetCore.OSS" Version="1.1.9" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="2.20.2" />
-    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.13.1" />
+    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="2.14.0" />
     <PackageReference Include="SqlSugarCore" Version="5.1.3.34" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.2.23" />
     <PackageReference Include="UAParser" Version="3.1.47" />

+ 3 - 4
Admin.NET/Admin.NET.Core/Admin.NET.Core.xml

@@ -5065,15 +5065,14 @@
         </member>
         <member name="M:Admin.NET.Core.Service.DbJobPersistence.Preload">
             <summary>
-            作业调度服务启动时
+            作业调度服务启动时
             </summary>
             <returns></returns>
         </member>
-        <member name="M:Admin.NET.Core.Service.DbJobPersistence.OnLoaded(System.String,Furion.Schedule.SchedulerBuilder)">
+        <member name="M:Admin.NET.Core.Service.DbJobPersistence.OnLoading(Furion.Schedule.SchedulerBuilder)">
             <summary>
-            作业计划加载完成(通常用来同步存储介质(如数据库)数据到内存中)
+            作业计划初始化通知
             </summary>
-            <param name="jobId"></param>
             <param name="builder"></param>
             <returns></returns>
         </member>

+ 2 - 1
Admin.NET/Admin.NET.Core/Job/LogJob.cs

@@ -3,7 +3,8 @@
 /// <summary>
 /// 清理日志作业任务
 /// </summary>
-[Daily(TriggerId = "tId_log", Description = "清理操作日志")]
+[JobDetail("job_log", Description = "清理操作日志", GroupName = "default", Concurrent = false)]
+[Daily(TriggerId = "trigger_log", Description = "清理操作日志")]
 public class LogJob : IJob
 {
     private readonly IServiceProvider _serviceProvider;

+ 2 - 1
Admin.NET/Admin.NET.Core/Job/OnlineUserJob.cs

@@ -3,7 +3,8 @@ using Admin.NET.Core;
 /// <summary>
 /// 清理在线用户作业任务
 /// </summary>
-[PeriodSeconds(1, TriggerId = "tId_onlineUser", Description = "清理在线用户", MaxNumberOfRuns = 1, StartNow = true, RunOnStart = true)]
+[JobDetail("job_onlineUser", Description = "清理在线用户", GroupName = "default", Concurrent = false)]
+[PeriodSeconds(1, TriggerId = "trigger_onlineUser", Description = "清理在线用户", MaxNumberOfRuns = 1, RunOnStart = true)]
 public class OnlineUserJob : IJob
 {
     private readonly IServiceProvider _serviceProvider;

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/Config/SysConfigService.cs

@@ -27,7 +27,7 @@ public class SysConfigService : IDynamicApiController, ITransient
         return await _sysConfigRep.AsQueryable()
             .WhereIF(!string.IsNullOrWhiteSpace(input.Name?.Trim()), u => u.Name.Contains(input.Name))
             .WhereIF(!string.IsNullOrWhiteSpace(input.Code?.Trim()), u => u.Code.Contains(input.Code))
-            .WhereIF(!string.IsNullOrWhiteSpace(input.GroupCode?.Trim()),u => u.GroupCode.Equals(input.GroupCode))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.GroupCode?.Trim()), u => u.GroupCode.Equals(input.GroupCode))
             .OrderBy(u => u.Order).ToPagedListAsync(input.Page, input.PageSize);
     }
 

+ 10 - 12
Admin.NET/Admin.NET.Core/Service/Job/DbJobPersistence.cs

@@ -13,32 +13,30 @@ public class DbJobPersistence : IJobPersistence
     }
 
     /// <summary>
-    /// 作业调度服务启动时
+    /// 作业调度服务启动时
     /// </summary>
     /// <returns></returns>
     public IEnumerable<SchedulerBuilder> Preload()
     {
         // 扫描所有实现IJob的作业任务
-        return App.EffectiveTypes.Where(t => t.IsJobType())
-            .Select(t => SchedulerBuilder.Create(JobBuilder.Create(t), t.ScanTriggers()));
+        return App.EffectiveTypes.ScanToBuilders();
     }
 
     /// <summary>
-    /// 作业计划加载完成(通常用来同步存储介质(如数据库)数据到内存中)
+    /// 作业计划初始化通知
     /// </summary>
-    /// <param name="jobId"></param>
     /// <param name="builder"></param>
     /// <returns></returns>
-    public SchedulerBuilder OnLoaded(string jobId, SchedulerBuilder builder)
+    public SchedulerBuilder OnLoading(SchedulerBuilder builder)
     {
         using var serviceScope = _serviceProvider.CreateScope();
         var rep = serviceScope.ServiceProvider.GetService<SqlSugarRepository<SysJobDetail>>();
-        //if (builder.Behavior == PersistenceBehavior.Removed)
-        //{
-        //    rep.Delete(u => u.JobId == jobId);
-        //    return builder.Removed();
-        //}
-        if (rep.IsAny(u => u.JobId == jobId))
+        if (builder.Behavior == PersistenceBehavior.Removed)
+        {
+            rep.Delete(u => u.JobId == builder.GetJobBuilder().JobId);
+            return builder.Removed();
+        }
+        if (rep.IsAny(u => u.JobId == builder.GetJobBuilder().JobId))
         {
             return builder.Updated();
         }

+ 25 - 7
Admin.NET/Admin.NET.Core/Service/Job/JobClusterServer.cs

@@ -5,13 +5,28 @@
 /// </summary>
 public class JobClusterServer : IJobClusterServer
 {
+    private readonly SqlSugarRepository<SysJobCluster> _sysJobClusterRep;
+
+    public JobClusterServer(SqlSugarRepository<SysJobCluster> sysJobClusterRep)
+    {
+        _sysJobClusterRep = sysJobClusterRep;
+    }
+
     /// <summary>
     /// 当前作业调度器启动通知
     /// </summary>
     /// <param name="context">作业集群服务上下文</param>
-    public void Start(JobClusterContext context)
+    public async void Start(JobClusterContext context)
     {
         // 在作业集群表中,如果 clusterId 不存在,则新增一条(否则更新一条),并设置 status 为 ClusterStatus.Waiting
+        if (await _sysJobClusterRep.IsAnyAsync(u => u.ClusterId == context.ClusterId))
+        {
+            await _sysJobClusterRep.UpdateSetColumnsTrueAsync(u => new SysJobCluster { Status = ClusterStatus.Waiting }, u => u.ClusterId == context.ClusterId);
+        }
+        else
+        {
+            await _sysJobClusterRep.InsertAsync(new SysJobCluster { ClusterId = context.ClusterId, Status = ClusterStatus.Waiting });
+        }
     }
 
     /// <summary>
@@ -31,8 +46,10 @@ public class JobClusterServer : IJobClusterServer
                 // 1) 如果作业集群表已有 status 为 ClusterStatus.Working 则继续循环
                 // 2) 如果作业集群表中还没有其他服务或只有自己,则插入一条集群服务或调用 await WorkNowAsync(clusterId); 之后 return;
                 // 3) 如果作业集群表中没有 status 为 ClusterStatus.Working 的,调用 await WorkNowAsync(clusterId); 之后 return;
+                if (await _sysJobClusterRep.IsAnyAsync(u => u.Status == ClusterStatus.Working))
+                    continue;
 
-                await WorkNowAsync(clusterId);
+                WorkNowAsync(clusterId);
                 return;
             }
             catch { }
@@ -46,18 +63,20 @@ public class JobClusterServer : IJobClusterServer
     /// 当前作业调度器停止通知
     /// </summary>
     /// <param name="context">作业集群服务上下文</param>
-    public void Stop(JobClusterContext context)
+    public async void Stop(JobClusterContext context)
     {
         // 在作业集群表中,更新 clusterId 的 status 为 ClusterStatus.Crashed
+        await _sysJobClusterRep.UpdateSetColumnsTrueAsync(u => new SysJobCluster { Status = ClusterStatus.Crashed }, u => u.ClusterId == context.ClusterId);
     }
 
     /// <summary>
     /// 当前作业调度器宕机
     /// </summary>
     /// <param name="context">作业集群服务上下文</param>
-    public void Crash(JobClusterContext context)
+    public async void Crash(JobClusterContext context)
     {
         // 在作业集群表中,更新 clusterId 的 status 为 ClusterStatus.Crashed
+        await _sysJobClusterRep.UpdateSetColumnsTrueAsync(u => new SysJobCluster { Status = ClusterStatus.Crashed }, u => u.ClusterId == context.ClusterId);
     }
 
     /// <summary>
@@ -65,10 +84,9 @@ public class JobClusterServer : IJobClusterServer
     /// </summary>
     /// <param name="clusterId">集群 Id</param>
     /// <returns></returns>
-    private Task WorkNowAsync(string clusterId)
+    private async void WorkNowAsync(string clusterId)
     {
         // 在作业集群表中,更新 clusterId 的 status 为 ClusterStatus.Working
-
-        return Task.CompletedTask;
+        await _sysJobClusterRep.UpdateSetColumnsTrueAsync(u => new SysJobCluster { Status = ClusterStatus.Working }, u => u.ClusterId == clusterId);
     }
 }

+ 0 - 1
Admin.NET/Admin.NET.Web.Core/Startup.cs

@@ -2,7 +2,6 @@ using Admin.NET.Core;
 using Admin.NET.Core.Service;
 using AspNetCoreRateLimit;
 using Furion;
-using Furion.Schedule;
 using Furion.SpecificationDocument;
 using IGeekFan.AspNetCore.Knife4jUI;
 using Microsoft.AspNetCore.Builder;