JobClusterServer.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 作业集群控制
  4. /// </summary>
  5. public class JobClusterServer : IJobClusterServer
  6. {
  7. /// <summary>
  8. /// 当前作业调度器启动通知
  9. /// </summary>
  10. /// <param name="context">作业集群服务上下文</param>
  11. public void Start(JobClusterContext context)
  12. {
  13. // 在作业集群表中,如果 clusterId 不存在,则新增一条(否则更新一条),并设置 status 为 ClusterStatus.Waiting
  14. }
  15. /// <summary>
  16. /// 等待被唤醒
  17. /// </summary>
  18. /// <param name="context">作业集群服务上下文</param>
  19. /// <returns><see cref="Task"/></returns>
  20. public async Task WaitingForAsync(JobClusterContext context)
  21. {
  22. var clusterId = context.ClusterId;
  23. while (true)
  24. {
  25. try
  26. {
  27. // 在这里查询数据库,根据以下两种情况处理
  28. // 1) 如果作业集群表已有 status 为 ClusterStatus.Working 则继续循环
  29. // 2) 如果作业集群表中还没有其他服务或只有自己,则插入一条集群服务或调用 await WorkNowAsync(clusterId); 之后 return;
  30. // 3) 如果作业集群表中没有 status 为 ClusterStatus.Working 的,调用 await WorkNowAsync(clusterId); 之后 return;
  31. await WorkNowAsync(clusterId);
  32. return;
  33. }
  34. catch { }
  35. // 控制集群心跳频率
  36. await Task.Delay(3000);
  37. }
  38. }
  39. /// <summary>
  40. /// 当前作业调度器停止通知
  41. /// </summary>
  42. /// <param name="context">作业集群服务上下文</param>
  43. public void Stop(JobClusterContext context)
  44. {
  45. // 在作业集群表中,更新 clusterId 的 status 为 ClusterStatus.Crashed
  46. }
  47. /// <summary>
  48. /// 当前作业调度器宕机
  49. /// </summary>
  50. /// <param name="context">作业集群服务上下文</param>
  51. public void Crash(JobClusterContext context)
  52. {
  53. // 在作业集群表中,更新 clusterId 的 status 为 ClusterStatus.Crashed
  54. }
  55. /// <summary>
  56. /// 指示集群可以工作
  57. /// </summary>
  58. /// <param name="clusterId">集群 Id</param>
  59. /// <returns></returns>
  60. private Task WorkNowAsync(string clusterId)
  61. {
  62. // 在作业集群表中,更新 clusterId 的 status 为 ClusterStatus.Working
  63. return Task.CompletedTask;
  64. }
  65. }