using Azure.Messaging.ServiceBus; using HTEXScreen.Service.AzureRedis; using Microsoft.Azure.Amqp.Framing; using Microsoft.Extensions.Caching.Memory; using System; using System.Net.Http; using System.Text; using System.Text.Json; using System.Text.Json.Nodes; using System.Threading; using System.Web; using TEAMModelOS.SDK.DI; namespace HTEXScreen.Service { public class ScreenPDFSubTest : 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 ScreenPDFSubTest(AzureRedisFactory azureRedisFactory, AzureCosmosFactory azureCosmosFactory, HttpClient httpClient, AzureStorageFactory azureStorage,AzureServiceBusFactory azureService) { _receiver = azureService.GetServiceBusClient("Test").CreateReceiver(Channel, new ServiceBusReceiverOptions { ReceiveMode= ServiceBusReceiveMode.PeekLock}); _httpClient = httpClient; _azureStorage = azureStorage; _azureRedisFactory = azureRedisFactory; _azureCosmosFactory= azureCosmosFactory; } protected async override Task ExecuteAsync(CancellationToken stoppingToken) { while (true) { //string sj = @"{'studentId': '20220809004', 'studentName': '学生4', 'picture': null, 'userType': 2, 'school': 'habook', 'classIds': [ 'ab41048e-b8ca-41fb-9224-30ba81b0e4e2' ], 'artId': '78c15535-cbd0-4239-b908-776ec6a43340', 'totalScore': 0, 'subjectScores': [ { 'subjectId': 'subject_painting', 'score': 0 } ], 'results': [ { 'taskId': 'd1162055-6a11-ac12-bd45-7d8962cf8f53', 'taskName': null, 'subjectId': 'subject_painting', 'subjectName': null, 'quotaId': 'quota_21', 'quotaName': '基础知识', 'quotaType': 1, 'score': -1, 'files': null }, { 'taskId': 'b8eb424c-7b80-79cd-4f86-5431bb8c9a3b', 'taskName': null, 'subjectId': 'subject_painting', 'subjectName': null, 'quotaId': 'quota_22', 'quotaName': '基本技能', 'quotaType': 2, 'score': -1, 'files': null } ], 'id': 'habook-20220809004', 'code': 'ArtResult-78c15535-cbd0-4239-b908-776ec6a43340', 'pk': 'ArtResult', 'ttl': -1, '_rid': 'omxMALJh0IhTowgAAAAAAA==', '_self': 'dbs/omxMAA==/colls/omxMALJh0Ig=/docs/omxMALJh0IhTowgAAAAAAA==/', '_etag': '\\'0200f067-0000-4200-0000-6355f1cd0000\\'', '_attachments': 'attachments/', '_ts': 1666576845 }"; //string json = "{\"studentId\": \"20220809004\", \"studentName\": \"学生4\", \"picture\": null, \"userType\": 2, \"school\": \"habook\", \"classIds\": [ \"ab41048e-b8ca-41fb-9224-30ba81b0e4e2\" ], \"artId\": \"78c15535-cbd0-4239-b908-776ec6a43340\", \"totalScore\": 0, \"subjectScores\": [ { \"subjectId\": \"subject_painting\", \"score\": 0 } ], \"results\": [ { \"taskId\": \"d1162055-6a11-ac12-bd45-7d8962cf8f53\", \"taskName\": null, \"subjectId\": \"subject_painting\", \"subjectName\": null, \"quotaId\": \"quota_21\", \"quotaName\": \"基础知识\", \"quotaType\": 1, \"score\": -1, \"files\": null }, { \"taskId\": \"b8eb424c-7b80-79cd-4f86-5431bb8c9a3b\", \"taskName\": null, \"subjectId\": \"subject_painting\", \"subjectName\": null, \"quotaId\": \"quota_22\", \"quotaName\": \"基本技能\", \"quotaType\": 2, \"score\": -1, \"files\": null } ], \"id\": \"habook-20220809004\", \"code\": \"ArtResult-78c15535-cbd0-4239-b908-776ec6a43340\", \"pk\": \"ArtResult\", \"ttl\": -1, \"_rid\": \"omxMALJh0IhTowgAAAAAAA==\", \"_self\": \"dbs/omxMAA==/colls/omxMALJh0Ig=/docs/omxMALJh0IhTowgAAAAAAA==/\", \"_etag\": \"\\\"0200f067-0000-4200-0000-6355f1cd0000\\\"\", \"_attachments\": \"attachments/\", \"_ts\": 1666576845 }"; //long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); //JsonNode node = JsonNode.Parse(json); //if (node != null) //{ // var pdfNode = node["pdf"]; // var id = node["id"]; // var code = node["code"]; // if (pdfNode != null) // { // pdfNode["url"] = "aaaa"; // pdfNode["blob"] = $"/art/"; // pdfNode["createTime"] = now; // // node["pdf"] = pdfNode; // } // else { // pdfNode = new JsonObject(); // pdfNode["url"] = "aaaa"; // pdfNode["blob"] = $"/art/"; // pdfNode["createTime"] = now; // node["pdf"] = pdfNode; // } // byte[] bytes = Encoding.UTF8.GetBytes(node.ToString()); // var memoryStream = new MemoryStream(bytes); // await _azureCosmosFactory.GetCosmosClient().GetContainer("TEAMModelOS", "Student").ReplaceItemStreamAsync(memoryStream, $"{id}", new Azure.Cosmos.PartitionKey($"{code}")); //} 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(); } } } }