ScreenPDFSubTest.cs 7.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using Azure.Messaging.ServiceBus;
  2. using HTEXScreen.Service.AzureRedis;
  3. using Microsoft.Azure.Amqp.Framing;
  4. using Microsoft.Extensions.Caching.Memory;
  5. using System;
  6. using System.Net.Http;
  7. using System.Text;
  8. using System.Text.Json;
  9. using System.Text.Json.Nodes;
  10. using System.Threading;
  11. using System.Web;
  12. using TEAMModelOS.SDK.DI;
  13. namespace HTEXScreen.Service
  14. {
  15. public class ScreenPDFSubTest : BackgroundService, IDisposable
  16. {
  17. private readonly AzureStorageFactory _azureStorage;
  18. private readonly HttpClient _httpClient;
  19. private readonly AzureRedisFactory _azureRedisFactory;
  20. private readonly AzureCosmosFactory _azureCosmosFactory;
  21. //消息订阅
  22. private const string Channel = "screenpdf";
  23. private readonly ServiceBusReceiver _receiver;
  24. public static SpinWait spinWait = new SpinWait(); // 构造SpinWait实例
  25. public ScreenPDFSubTest(AzureRedisFactory azureRedisFactory, AzureCosmosFactory azureCosmosFactory, HttpClient httpClient, AzureStorageFactory azureStorage,AzureServiceBusFactory azureService)
  26. {
  27. _receiver = azureService.GetServiceBusClient("Test").CreateReceiver(Channel, new ServiceBusReceiverOptions { ReceiveMode= ServiceBusReceiveMode.PeekLock});
  28. _httpClient = httpClient;
  29. _azureStorage = azureStorage;
  30. _azureRedisFactory = azureRedisFactory;
  31. _azureCosmosFactory= azureCosmosFactory;
  32. }
  33. protected async override Task ExecuteAsync(CancellationToken stoppingToken)
  34. {
  35. while (true)
  36. {
  37. //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 }";
  38. //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 }";
  39. //long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  40. //JsonNode node = JsonNode.Parse(json);
  41. //if (node != null)
  42. //{
  43. // var pdfNode = node["pdf"];
  44. // var id = node["id"];
  45. // var code = node["code"];
  46. // if (pdfNode != null)
  47. // {
  48. // pdfNode["url"] = "aaaa";
  49. // pdfNode["blob"] = $"/art/";
  50. // pdfNode["createTime"] = now;
  51. // // node["pdf"] = pdfNode;
  52. // }
  53. // else {
  54. // pdfNode = new JsonObject();
  55. // pdfNode["url"] = "aaaa";
  56. // pdfNode["blob"] = $"/art/";
  57. // pdfNode["createTime"] = now;
  58. // node["pdf"] = pdfNode;
  59. // }
  60. // byte[] bytes = Encoding.UTF8.GetBytes(node.ToString());
  61. // var memoryStream = new MemoryStream(bytes);
  62. // await _azureCosmosFactory.GetCosmosClient().GetContainer("TEAMModelOS", "Student").ReplaceItemStreamAsync(memoryStream, $"{id}", new Azure.Cosmos.PartitionKey($"{code}"));
  63. //}
  64. IReadOnlyList<ServiceBusReceivedMessage> receivedMessages = await _receiver.ReceiveMessagesAsync(maxMessages: 1);
  65. //单条数据 5 分钟未释放。进入死信
  66. foreach (ServiceBusReceivedMessage receivedMessage in receivedMessages)
  67. {
  68. try
  69. {
  70. string body = receivedMessage.Body.ToString();
  71. ScreenshotDto? screenshot = JsonSerializer.Deserialize<ScreenshotDto>(body);
  72. await _receiver.CompleteMessageAsync(receivedMessage);
  73. List<(string name ,string url)> urls= await ScreenService.ScreenshotPdf(screenshot, _azureStorage);
  74. await ScreenService.UpdateStuArtPDF(urls.Select(z=>z.url), screenshot, _azureRedisFactory, _azureCosmosFactory);
  75. } catch
  76. {
  77. //失败则放回队列死信中
  78. await _receiver.DeadLetterMessageAsync(receivedMessage);
  79. }
  80. }
  81. //cpu空转一次
  82. spinWait.SpinOnce();
  83. }
  84. }
  85. }
  86. }