AipServiceMain.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. 
  2. using AipGateway.API.Application.Configurations;
  3. using Microsoft.AspNetCore.Connections;
  4. using Serilog;
  5. using System.Diagnostics;
  6. using System.Threading.Channels;
  7. namespace AipGateway.AIP.Service.WindowsService
  8. {
  9. public class AipServiceMain : BackgroundService
  10. {
  11. private readonly ILogger<AipServiceMain> _log;
  12. private readonly AipSettings _aipSettings;
  13. private static List<AipProcessInfomation> _AipProcessList = new List<AipProcessInfomation>();
  14. private static WebApplicationBuilder? _builder;
  15. public AipServiceMain(ILogger<AipServiceMain> log, AipSettings aipSettings)
  16. {
  17. _log = log;
  18. _aipSettings = aipSettings;
  19. InitializeSubProcess();
  20. }
  21. private void InitializeSubProcess()
  22. {
  23. var currentProcessPath = Process.GetCurrentProcess().MainModule!.FileName;
  24. int defPort = _aipSettings.Port;
  25. int bindings = _aipSettings.Bindings;
  26. for (int ii = 0; ii < bindings; ii++)
  27. {
  28. int Port = defPort + (ii+1);
  29. var startInfo = new ProcessStartInfo
  30. {
  31. FileName = currentProcessPath,
  32. Arguments = $"{Port} {_aipSettings.ProcessId}",
  33. CreateNoWindow = true,
  34. UseShellExecute = false
  35. };
  36. AipProcessInfomation aipProcessInfo = new AipProcessInfomation {
  37. ProcessName = currentProcessPath,
  38. CreateAt = DateTime.Now,
  39. Port = Port,
  40. process = Process.Start(startInfo)
  41. };
  42. if (aipProcessInfo.process == null)
  43. {
  44. _log.LogError("Aip Process Start Failed: {0} ==> Port: {1}.", currentProcessPath, Port);
  45. }
  46. else
  47. {
  48. _log.LogInformation("Aip Process Start {0} ==> Port: {1}, PID: {2}.", currentProcessPath, Port, aipProcessInfo.process.Id);
  49. }
  50. _AipProcessList.Add(aipProcessInfo);
  51. }
  52. }
  53. private Process? StartSubProcess(int port)
  54. {
  55. var currentProcessPath = Process.GetCurrentProcess().MainModule!.FileName;
  56. var startInfo = new ProcessStartInfo
  57. {
  58. FileName = currentProcessPath,
  59. Arguments = $"{port}",
  60. CreateNoWindow = true,
  61. UseShellExecute = false
  62. };
  63. return Process.Start(startInfo);
  64. }
  65. protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  66. {
  67. stoppingToken.Register(() => _log.LogInformation("ServiceA is stopping."));
  68. while (!stoppingToken.IsCancellationRequested)
  69. {
  70. foreach (AipProcessInfomation aipProcess in _AipProcessList)
  71. {
  72. Process? runProcess = aipProcess.process;
  73. if (runProcess == null)
  74. {
  75. _log.LogError("Aip Process Start Failed: {0} ==> Port: {1}.", aipProcess.ProcessName, aipProcess.Port);
  76. aipProcess.process = StartSubProcess(aipProcess.Port);
  77. }
  78. else
  79. {
  80. var process = Process.GetProcessById(runProcess.Id);
  81. if (process == null)
  82. {
  83. _log.LogError("Aip Process Terminated: {0} ==> Port: {1}.", aipProcess.ProcessName, aipProcess.Port);
  84. aipProcess.process = StartSubProcess(aipProcess.Port);
  85. }
  86. }
  87. }
  88. await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);
  89. }
  90. }
  91. public override void Dispose()
  92. {
  93. _log.LogError("Aip Service Main terminated.");
  94. foreach (AipProcessInfomation aipProcess in _AipProcessList)
  95. {
  96. Process? runProcess = aipProcess.process;
  97. if (runProcess != null)
  98. {
  99. var process = Process.GetProcessById(runProcess.Id);
  100. if (process != null)
  101. {
  102. _log.LogInformation("Aip Process Kill: {0}, {1}", runProcess.Id, aipProcess.Port);
  103. process.Kill();
  104. }
  105. }
  106. }
  107. base.Dispose();
  108. }
  109. public static void Start(AipSettings aipSettings)
  110. {
  111. //_builder =
  112. }
  113. }
  114. }