ScreenPDFSub.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Azure.Messaging.ServiceBus;
  2. using System.Text.Json;
  3. using TEAMModelOS.SDK.DI;
  4. namespace HTEXScreen.Service
  5. {
  6. public class ScreenPDFSub : BackgroundService, IDisposable
  7. {
  8. private readonly AzureStorageFactory _azureStorage;
  9. private readonly HttpClient _httpClient;
  10. private readonly AzureRedisFactory _azureRedisFactory;
  11. private readonly AzureCosmosFactory _azureCosmosFactory;
  12. //消息订阅
  13. private const string Channel = "screenpdf";
  14. private readonly ServiceBusReceiver _receiver;
  15. public static SpinWait spinWait = new SpinWait(); // 构造SpinWait实例
  16. public ScreenPDFSub(AzureRedisFactory azureRedisFactory, AzureCosmosFactory azureCosmosFactory, HttpClient httpClient, AzureStorageFactory azureStorage,AzureServiceBusFactory azureService)
  17. {
  18. _receiver = azureService.GetServiceBusClient("Default").CreateReceiver(Channel, new ServiceBusReceiverOptions { ReceiveMode= ServiceBusReceiveMode.PeekLock});
  19. _httpClient = httpClient;
  20. _azureStorage = azureStorage;
  21. _azureRedisFactory = azureRedisFactory;
  22. _azureCosmosFactory = azureCosmosFactory;
  23. }
  24. protected async override Task ExecuteAsync(CancellationToken stoppingToken)
  25. {
  26. while (true)
  27. {
  28. IReadOnlyList<ServiceBusReceivedMessage> receivedMessages = await _receiver.ReceiveMessagesAsync(maxMessages: 1);
  29. //单条数据 5 分钟未释放。进入死信
  30. foreach (ServiceBusReceivedMessage receivedMessage in receivedMessages)
  31. {
  32. try
  33. {
  34. string body = receivedMessage.Body.ToString();
  35. ScreenshotDto? screenshot = JsonSerializer.Deserialize<ScreenshotDto>(body);
  36. await _receiver.CompleteMessageAsync(receivedMessage);
  37. List<(string name ,string url )> urls= await ScreenService.ScreenshotPdf(screenshot, _azureStorage);
  38. await ScreenService.UpdateStuArtPDF(urls.Select(z => z.url), screenshot, _azureRedisFactory, _azureCosmosFactory);
  39. } catch
  40. {
  41. //失败则放回队列死信中
  42. await _receiver.DeadLetterMessageAsync(receivedMessage);
  43. }
  44. }
  45. //cpu空转一次
  46. spinWait.SpinOnce();
  47. }
  48. }
  49. }
  50. }