using Azure.Messaging.ServiceBus; using HTEXScreen.Service; using System.ServiceModel.Channels; using System.Text.Json; using TEAMModelOS.SDK.DI; namespace HTEX.Screen.Service { public class BookjsScreenSub : BackgroundService, IDisposable { private readonly AzureStorageFactory _azureStorage; private readonly HttpClient _httpClient; private readonly AzureRedisFactory _azureRedisFactory; private readonly AzureCosmosFactory _azureCosmosFactory; //消息订阅 private const string Channel = "genpdf"; private readonly ServiceBusReceiver _receiver; public static SpinWait spinWait = new SpinWait(); // 构造SpinWait实例 private readonly ILogger _logger; public BookjsScreenSub(ILogger logger, 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; _logger = logger; } protected async override Task ExecuteAsync(CancellationToken stoppingToken) { while (true) { IReadOnlyList receivedMessages = await _receiver.ReceiveMessagesAsync(maxMessages: 1); //单条数据 5 分钟未释放。进入死信 foreach (ServiceBusReceivedMessage receivedMessage in receivedMessages) { try { _logger.LogInformation("Message ID: {id}", receivedMessage.MessageId); _logger.LogInformation("Message Body: {body}", receivedMessage.Body); _logger.LogInformation("Message Content-Type: {contentType}", receivedMessage.ContentType); string body = receivedMessage.Body.ToString(); ScreenshotDto? screenshot = JsonSerializer.Deserialize(body); await _receiver.CompleteMessageAsync(receivedMessage); } catch { //失败则放回队列死信中 await _receiver.DeadLetterMessageAsync(receivedMessage); } } //cpu空转一次 spinWait.SpinOnce(); } } /// /// 节点信息 /// public record ScreenApiNode { /// /// 客户端id /// public string? clientId { get; set; } /// /// 描述 /// public string? desc { get; set; } /// /// 服务域 /// public string? domain { get; set; } /// /// 状态 busy 忙碌,free 空闲,down 离线 /// public string? status { get; set; } /// /// 权重 /// public int weight { get; set;} } } }