xfe 3 nedēļas atpakaļ
vecāks
revīzija
6775575a43

+ 20 - 3
src/Hotline/BatchTask/Apptask.cs

@@ -1,5 +1,4 @@
 using SqlSugar;
-using System;
 using XF.Domain.Repository;
 
 namespace Hotline.BatchTask;
@@ -19,7 +18,12 @@ public class Apptask : CreationEntity
     /// </summary>
     public string TaskDesc { get; set; } = string.Empty;
 
+    /// <summary>
+    /// 任务类型
+    /// </summary>
+    public ETaskType TaskType { get; set; }
 
+    [Navigate(NavigateType.OneToMany, nameof(ApptaskItem.ApptaskId))]
     public List<ApptaskItem> ApptaskItems { get; set; }
 }
 
@@ -37,7 +41,7 @@ public class ApptaskItem
     public string BusinessId { get; set; }
 
     /// <summary>
-    /// 任务类型
+    /// 任务类型(冗余)
     /// </summary>
     public ETaskType TaskType { get; set; }
 
@@ -49,7 +53,8 @@ public class ApptaskItem
     /// <summary>
     /// 任务执行时间
     /// </summary>
-    public DateTime? TaskExecuteTime { get; set; }
+    public DateTime? TaskStartTime { get; set; }
+    public DateTime? TaskEndTime { get; set; }
 
     /// <summary>
     /// 参数
@@ -57,9 +62,20 @@ public class ApptaskItem
     [SugarColumn(ColumnDataType = "varchar(8000)")]
     public string TaskParams { get; set; }
 
+    /// <summary>
+    /// 执行次数
+    /// </summary>
+    public int Tries { get; set; }
+
+    /// <summary>
+    /// 执行次数上限
+    /// </summary>
+    public int Limit { get; set; } = 1;
+
     [SugarColumn(IsEnableUpdateVersionValidation = true)]
     public string Ver { get; set; }
 
+    [Navigate(NavigateType.OneToOne, nameof(ApptaskId))]
     public Apptask Apptask { get; set; }
 }
 
@@ -72,6 +88,7 @@ public enum ETaskStatus
     Processing = 1,
     Success = 2,
     Failed = 3,
+    Terminated = 9,
 }
 
 /// <summary>

+ 57 - 0
src/Hotline/BatchTask/ApptaskDomainService.cs

@@ -0,0 +1,57 @@
+namespace Hotline.BatchTask;
+
+public class ApptaskDomainService : IApptaskDomainService
+{
+    /// <summary>
+    /// 新增任务
+    /// </summary>
+    public Task<string> AddAsync(Apptask apptask, CancellationToken cancellation)
+    {
+        //todo 1.参数校验,
+        //2. 任务名称可选:依据任务类型生成 3.类型、次数上限由主表冗余到明细
+        throw new NotImplementedException();
+    }
+
+    /// <summary>
+    /// 查询任务进度
+    /// </summary>
+    /// <returns></returns>
+    public Task<ApptaskProgress> QueryProgressAsync(string taskId, CancellationToken cancellation)
+    {
+        throw new NotImplementedException();
+    }
+
+    /// <summary>
+    /// 终止任务
+    /// </summary>
+    /// <param name="taskId"></param>
+    /// <param name="cancellation"></param>
+    /// <returns></returns>
+    public Task TerminalTaskAsync(string taskId, CancellationToken cancellation)
+    {
+        throw new NotImplementedException();
+    }
+
+    /// <summary>
+    /// 获取一个待执行的任务
+    /// </summary>
+    /// <param name="cancellation"></param>
+    /// <returns></returns>
+    public Task<ApptaskItem> GetWaitingTaskAsync(CancellationToken cancellation)
+    {
+        // 1. 乐观锁 2.待执行 或 失败并且次数未到上限的
+        throw new NotImplementedException();
+    }
+
+    /// <summary>
+    /// 执行任务
+    /// </summary>
+    /// <param name="executor"></param>
+    /// <param name="cancellation"></param>
+    /// <returns></returns>
+    public Task ExecuteAsync(IApptaskExecutor executor, CancellationToken cancellation)
+    {
+        // try catch到ex或返回fail的执行失败,返回成功的执行成功
+        throw new NotImplementedException();
+    }
+}

+ 22 - 4
src/Hotline/BatchTask/IApptaskDomainService.cs

@@ -17,7 +17,7 @@ namespace Hotline.BatchTask
         /// 查询任务进度
         /// </summary>
         /// <returns></returns>
-        Task<> QueryProgressAsync(string taskId, CancellationToken cancellation);
+        Task<ApptaskProgress> QueryProgressAsync(string taskId, CancellationToken cancellation);
 
         /// <summary>
         /// 终止任务
@@ -28,13 +28,31 @@ namespace Hotline.BatchTask
         Task TerminalTaskAsync(string taskId, CancellationToken cancellation);
 
         /*job request*/
-        Task<ApptaskItem> GetNextAsync(CancellationToken cancellation);
+        /// <summary>
+        /// 获取一个待执行的任务
+        /// </summary>
+        /// <param name="cancellation"></param>
+        /// <returns></returns>
+        Task<ApptaskItem> GetWaitingTaskAsync(CancellationToken cancellation);
 
+        /// <summary>
+        /// 执行任务
+        /// </summary>
+        /// <param name="executor"></param>
+        /// <param name="cancellation"></param>
+        /// <returns></returns>
         Task ExecuteAsync(IApptaskExecutor executor, CancellationToken cancellation);
     }
 
-    public class ApptaskDomainService : IApptaskDomainService
+    /// <summary>
+    /// 任务进度
+    /// </summary>
+    public class ApptaskProgress
     {
-
+        public int Total { get; set; }
+        public int Waiting { get; set; }
+        public int Processing { get; set; }
+        public int Success { get; set; }
+        public int Fail { get; set; }
     }
 }

+ 12 - 0
src/Hotline/BatchTask/IApptaskExecutor.cs

@@ -0,0 +1,12 @@
+namespace Hotline.BatchTask;
+
+public interface IApptaskExecutor
+{
+    /// <summary>
+    /// 执行任务
+    /// </summary>
+    /// <param name="request"></param>
+    /// <param name="cancellation"></param>
+    /// <returns>是否成功执行</returns>
+    Task<bool> ExecuteAsync<TRequest>(TRequest request, CancellationToken cancellation);
+}