ScreenPDFSub.cs 2.7 KB

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