ScreenPDFSubTest.cs 7.0 KB

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