Guest User

Untitled

a guest
Oct 24th, 2021
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.32 KB | None | 0 0
  1. using AutoMapper;
  2. using Exchange.ExchangeApplicationContracts;
  3. using JetBrains.Annotations;
  4. using Microsoft.Extensions.Hosting;
  5. using Microsoft.Extensions.Logging;
  6. using Newtonsoft.Json;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Diagnostics;
  10. using System.Linq;
  11. using System.Threading;
  12. using System.Threading.Tasks;
  13. using Volo.Abp.ObjectMapping;
  14. using Volo.Abp.Uow;
  15.  
  16. namespace Currency
  17. {
  18. /// <summary>
  19. /// Фоновая задача для считывания валют с указанной биржи
  20. /// </summary>
  21. public class CurrencyRunner : BackgroundService
  22. {
  23. private readonly IMapper _mapper;
  24. private IExchangeProvider _exchangeProvider;
  25. private ICurrencyRepository _currencyRepository;
  26. private readonly ICurrencyCrudAppService _currencyCrudService;
  27. private static object locker = new();
  28.  
  29. public CurrencyRunner([NotNull] IExchangeProvider exchangeProvider,
  30. [NotNull] ICurrencyRepository currencyRepository,
  31. [NotNull] ICurrencyCrudAppService currencyCrudService,
  32. [NotNull] IMapper mapper)
  33. {
  34. _exchangeProvider = exchangeProvider ?? throw new ArgumentNullException(nameof(exchangeProvider));
  35. _currencyRepository = currencyRepository ?? throw new ArgumentNullException(nameof(currencyRepository));
  36. _currencyCrudService = currencyCrudService ?? throw new ArgumentNullException(nameof(currencyCrudService));
  37. _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
  38. }
  39.  
  40. [UnitOfWork(IsDisabled = true)]
  41. public void Execute(string exchangeId)
  42. {
  43. var exchange = _exchangeProvider.Get(exchangeId);
  44. var exchanges = _exchangeProvider.GetAll();
  45.  
  46. IEnumerable<CurrencyDto> currencies = Enumerable.Empty<CurrencyDto>();
  47.  
  48. bool isRequestError;
  49. int countErrors = 0;
  50. //Возможно из за большой загруженности или приоритетов в обработки команд, биржи иногда отклоняют запросы
  51. //Поэтому делается несколько попыток обращений
  52. do
  53. {
  54. try
  55. {
  56. isRequestError = false;
  57.  
  58. currencies = (IEnumerable<CurrencyDto>)exchange.ExchangeDriver.CurrenciesAsync().Result;
  59.  
  60. countErrors = 1000;
  61. }
  62. catch (JsonSerializationException e)
  63. {
  64. isRequestError = true;
  65.  
  66. Debug.WriteLine($"{exchangeId} don't response {++countErrors} times when read currencies", e);
  67.  
  68. Task.Delay(5000);
  69. }
  70. } while (isRequestError || countErrors <= 5);
  71.  
  72. foreach (CurrencyDto currency in currencies)
  73. {
  74. ///Обязательно нужна блокировка на две операции чтения и записи, чтобы разные потоки
  75. /// не могли записать одну и ту же валюту в БД
  76. lock (locker)
  77. {
  78. var curr = _currencyRepository.FirstOrDefault(x => x.BrifName.ToUpper() == currency.BrifName.ToUpper());
  79.  
  80. if (curr == null)
  81. {
  82. currency.BrifName = currency.BrifName.ToUpper();
  83. currency.Id = Guid.NewGuid();
  84.  
  85. var currencyDto = _currencyCrudService.CreateAsync(_mapper.Map<CreateCurrencyDto>(currency)).Result;
  86.  
  87. Console.WriteLine($"Валюта {currencyDto.BrifName.ToUpper()} добавлена в БД");
  88. }
  89. else
  90. {
  91. Console.WriteLine($"Валюта {currency.BrifName.ToUpper()} уже имеется в БД");
  92. }
  93. }
  94. }
  95.  
  96. Console.WriteLine("Добавление валют в БД завершено");
  97. }
  98.  
  99. protected override Task ExecuteAsync(CancellationToken stoppingToken)
  100. {
  101. throw new NotImplementedException();
  102. }
  103. }
  104. }
Add Comment
Please, Sign In to add comment