using Azure.Messaging.ServiceBus; using HTEXScreen.Service.AzureRedis; using Microsoft.Azure.Amqp.Framing; using Microsoft.Extensions.Caching.Memory; using System.Net.Http; using System.Text.Json; using System.Threading; using TEAMModelOS.SDK.DI; namespace HTEXScreen.Service { public class ScreenPDFSub : BackgroundService, IDisposable { private readonly AzureStorageFactory _azureStorage; private readonly HttpClient _httpClient; private readonly AzureRedisFactory _azureRedisFactory; private readonly AzureCosmosFactory _azureCosmosFactory; //消息订阅 private const string Channel = "screenpdf"; private readonly ServiceBusReceiver _receiver; public static SpinWait spinWait = new SpinWait(); // 构造SpinWait实例 public ScreenPDFSub(AzureRedisFactory azureRedisFactory, AzureCosmosFactory azureCosmosFactory, HttpClient httpClient, AzureStorageFactory azureStorage,AzureServiceBusFactory azureService) { _receiver = azureService.GetServiceBusClient("Default").CreateReceiver(Channel, new ServiceBusReceiverOptions { ReceiveMode= ServiceBusReceiveMode.PeekLock}); _httpClient = httpClient; _azureStorage = azureStorage; _azureRedisFactory = azureRedisFactory; _azureCosmosFactory = azureCosmosFactory; } protected async override Task ExecuteAsync(CancellationToken stoppingToken) { while (true) { IReadOnlyList receivedMessages = await _receiver.ReceiveMessagesAsync(maxMessages: 1); //单条数据 5 分钟未释放。进入死信 foreach (ServiceBusReceivedMessage receivedMessage in receivedMessages) { try { string body = receivedMessage.Body.ToString(); ScreenshotDto? screenshot = JsonSerializer.Deserialize(body); await _receiver.CompleteMessageAsync(receivedMessage); List<(string name ,string url )> urls= await ScreenService.ScreenshotPdf(screenshot, _azureStorage); await ScreenService.UpdateStuArtPDF(urls.Select(z => z.url), screenshot, _azureRedisFactory, _azureCosmosFactory); } catch { //失败则放回队列死信中 await _receiver.DeadLetterMessageAsync(receivedMessage); } } //cpu空转一次 spinWait.SpinOnce(); } } } }