12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- 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<ServiceBusReceivedMessage> receivedMessages = await _receiver.ReceiveMessagesAsync(maxMessages: 1);
- //单条数据 5 分钟未释放。进入死信
- foreach (ServiceBusReceivedMessage receivedMessage in receivedMessages)
- {
- try
- {
- string body = receivedMessage.Body.ToString();
- ScreenshotDto? screenshot = JsonSerializer.Deserialize<ScreenshotDto>(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();
- }
- }
- }
- }
|