12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- 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<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();
- }
- }
- }
- }
|