BookjsScreenSub.cs 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using Azure.Messaging.ServiceBus;
  2. using HTEXScreen.Service;
  3. using System.ServiceModel.Channels;
  4. using System.Text.Json;
  5. using TEAMModelOS.SDK.DI;
  6. namespace HTEX.Screen.Service
  7. {
  8. public class BookjsScreenSub : BackgroundService, IDisposable
  9. {
  10. private readonly AzureStorageFactory _azureStorage;
  11. private readonly HttpClient _httpClient;
  12. private readonly AzureRedisFactory _azureRedisFactory;
  13. private readonly AzureCosmosFactory _azureCosmosFactory;
  14. //消息订阅
  15. private const string Channel = "genpdf";
  16. private readonly ServiceBusReceiver _receiver;
  17. public static SpinWait spinWait = new SpinWait(); // 构造SpinWait实例
  18. private readonly ILogger<BookjsScreenSub> _logger;
  19. public BookjsScreenSub(ILogger<BookjsScreenSub> logger, AzureRedisFactory azureRedisFactory, AzureCosmosFactory azureCosmosFactory, HttpClient httpClient, AzureStorageFactory azureStorage, AzureServiceBusFactory azureService)
  20. {
  21. _receiver = azureService.GetServiceBusClient("Default").CreateReceiver(Channel, new ServiceBusReceiverOptions { ReceiveMode= ServiceBusReceiveMode.PeekLock });
  22. _httpClient = httpClient;
  23. _azureStorage = azureStorage;
  24. _azureRedisFactory = azureRedisFactory;
  25. _azureCosmosFactory = azureCosmosFactory;
  26. _logger = logger;
  27. }
  28. protected async override Task ExecuteAsync(CancellationToken stoppingToken)
  29. {
  30. while (true)
  31. {
  32. IReadOnlyList<ServiceBusReceivedMessage> receivedMessages = await _receiver.ReceiveMessagesAsync(maxMessages: 1);
  33. //单条数据 5 分钟未释放。进入死信
  34. foreach (ServiceBusReceivedMessage receivedMessage in receivedMessages)
  35. {
  36. try
  37. {
  38. _logger.LogInformation("Message ID: {id}", receivedMessage.MessageId);
  39. _logger.LogInformation("Message Body: {body}", receivedMessage.Body);
  40. _logger.LogInformation("Message Content-Type: {contentType}", receivedMessage.ContentType);
  41. string body = receivedMessage.Body.ToString();
  42. ScreenshotDto? screenshot = JsonSerializer.Deserialize<ScreenshotDto>(body);
  43. await _receiver.CompleteMessageAsync(receivedMessage);
  44. }
  45. catch
  46. {
  47. //失败则放回队列死信中
  48. await _receiver.DeadLetterMessageAsync(receivedMessage);
  49. }
  50. }
  51. //cpu空转一次
  52. spinWait.SpinOnce();
  53. }
  54. }
  55. /// <summary>
  56. /// 节点信息
  57. /// </summary>
  58. public record ScreenApiNode
  59. {
  60. /// <summary>
  61. /// 客户端id
  62. /// </summary>
  63. public string? clientId { get; set; }
  64. /// <summary>
  65. /// 描述
  66. /// </summary>
  67. public string? desc { get; set; }
  68. /// <summary>
  69. /// 服务域
  70. /// </summary>
  71. public string? domain { get; set; }
  72. /// <summary>
  73. /// 状态 busy 忙碌,free 空闲,down 离线
  74. /// </summary>
  75. public string? status { get; set; }
  76. /// <summary>
  77. /// 权重
  78. /// </summary>
  79. public int weight { get; set;}
  80. }
  81. }
  82. }