TaskService.cs 4.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using Azure.Storage.Sas;
  2. using StackExchange.Redis;
  3. using System.Web;
  4. using TEAMModelOS.SDK.DI;
  5. using TEAMModelOS.SDK;
  6. using TEAMModelOS.SDK.Extension;
  7. namespace HTEX.Complex.Services
  8. {
  9. public class TaskService
  10. {
  11. public static async Task<(PDFGenRedis genRedis, PDFGenQueue genQueue, string msg)> SentTask(AzureRedisFactory _azureRedis, AzureStorageFactory _azureStorage, ILogger logger,ClientDevice serverDevice)
  12. {
  13. string msg = string.Empty;
  14. //从尾部弹出元素,队列先进先出
  15. long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
  16. var queueValue = await _azureRedis.GetRedisClient(8).ListRightPopAsync($"PDFGen:Queue:{serverDevice.deviceId}");
  17. PDFGenRedis genRedis = null;
  18. PDFGenQueue genQueue = null;
  19. if (queueValue!=default && queueValue.HasValue)
  20. {
  21. genQueue = queueValue.ToString().ToObject<PDFGenQueue>();
  22. RedisValue redisValue = await _azureRedis.GetRedisClient(8).HashGetAsync($"PDFGen:{genQueue.sessionId}", genQueue.id);
  23. if (redisValue!=default)
  24. {
  25. genRedis = redisValue.ToString().ToObject<PDFGenRedis>();
  26. //计算等待了多久的时间才开始生成。
  27. var wait = now- genRedis.join;
  28. genRedis.wait = wait;
  29. genRedis.status = 1;
  30. try
  31. {
  32. Uri uri = new Uri(genQueue.pageUrl);
  33. var query = HttpUtility.ParseQueryString(uri.Query);
  34. string? url = query["url"];
  35. if (!string.IsNullOrWhiteSpace(url))
  36. {
  37. url= HttpUtility.UrlDecode(url);
  38. uri = new Uri(url);
  39. string host = uri.Host;
  40. var blobServiceClient = _azureStorage.GetBlobServiceClient();
  41. if (host.Equals(blobServiceClient.Uri.Host))
  42. {
  43. // 获取容器名,它是路径的第一个部分
  44. string containerName = uri.Segments[1].TrimEnd('/');
  45. // 获取文件的完整同级目录,这是文件路径中除了文件名和扩展名之外的部分
  46. // 由于文件名是路径的最后一个部分,我们可以通过连接除了最后一个部分之外的所有部分来获取目录路径
  47. string directoryPath = string.Join("", uri.Segments, 2, uri.Segments.Length - 3);
  48. string? fileName = Path.GetFileNameWithoutExtension(uri.AbsolutePath);
  49. string blobPath = $"{directoryPath}{fileName}.pdf";
  50. var urlSas = _azureStorage.GetBlobSAS(containerName, blobPath, BlobSasPermissions.Write|BlobSasPermissions.Read, hour: 1);
  51. genQueue.blobSas = urlSas.sas;
  52. genQueue.blobName=blobPath;
  53. genQueue.cntName=containerName;
  54. genQueue.blobFullUrl=urlSas.fullUri;
  55. }
  56. else
  57. {
  58. msg=$"数据地址与服务提供的站点不一致!{host},{blobServiceClient.Uri.Host}";
  59. genRedis.status=3;
  60. genRedis.msg = msg;
  61. }
  62. }
  63. else
  64. {
  65. msg="数据地址解析异常!";
  66. genRedis.status=3;
  67. genRedis.msg = msg;
  68. }
  69. }
  70. catch (Exception ex)
  71. {
  72. msg =$"数据地址处理异常,异常信息:{ex.Message}";
  73. logger.LogInformation($"{msg},{ex.StackTrace}");
  74. genRedis.status=3;
  75. genRedis.msg = ex.Message;
  76. }
  77. await _azureRedis.GetRedisClient(8).HashSetAsync($"PDFGen:{genQueue.sessionId}", genQueue.id, genRedis.ToJsonString());
  78. }
  79. else
  80. {
  81. msg="队列任务关联数据为空!";
  82. }
  83. }
  84. else
  85. {
  86. msg="队列暂无任务!";
  87. }
  88. return (genRedis, genQueue, msg);
  89. }
  90. }
  91. }