12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- 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<BookjsScreenSub> _logger;
- public BookjsScreenSub(ILogger<BookjsScreenSub> 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<ServiceBusReceivedMessage> 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<ScreenshotDto>(body);
- await _receiver.CompleteMessageAsync(receivedMessage);
- }
- catch
- {
- //失败则放回队列死信中
- await _receiver.DeadLetterMessageAsync(receivedMessage);
- }
- }
- //cpu空转一次
- spinWait.SpinOnce();
- }
- }
- /// <summary>
- /// 节点信息
- /// </summary>
- public record ScreenApiNode
- {
- /// <summary>
- /// 客户端id
- /// </summary>
- public string? clientId { get; set; }
- /// <summary>
- /// 描述
- /// </summary>
- public string? desc { get; set; }
- /// <summary>
- /// 服务域
- /// </summary>
- public string? domain { get; set; }
- /// <summary>
- /// 状态 busy 忙碌,free 空闲,down 离线
- /// </summary>
- public string? status { get; set; }
- /// <summary>
- /// 权重
- /// </summary>
- public int weight { get; set;}
- }
- }
- }
|