Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using AutoMapper;
- using Exchange.ExchangeApplicationContracts;
- using JetBrains.Annotations;
- using Microsoft.Extensions.Hosting;
- using Microsoft.Extensions.Logging;
- using Newtonsoft.Json;
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Linq;
- using System.Threading;
- using System.Threading.Tasks;
- using Volo.Abp.ObjectMapping;
- using Volo.Abp.Uow;
- namespace Currency
- {
- /// <summary>
- /// Фоновая задача для считывания валют с указанной биржи
- /// </summary>
- public class CurrencyRunner : BackgroundService
- {
- private readonly IMapper _mapper;
- private IExchangeProvider _exchangeProvider;
- private ICurrencyRepository _currencyRepository;
- private readonly ICurrencyCrudAppService _currencyCrudService;
- private static object locker = new();
- public CurrencyRunner([NotNull] IExchangeProvider exchangeProvider,
- [NotNull] ICurrencyRepository currencyRepository,
- [NotNull] ICurrencyCrudAppService currencyCrudService,
- [NotNull] IMapper mapper)
- {
- _exchangeProvider = exchangeProvider ?? throw new ArgumentNullException(nameof(exchangeProvider));
- _currencyRepository = currencyRepository ?? throw new ArgumentNullException(nameof(currencyRepository));
- _currencyCrudService = currencyCrudService ?? throw new ArgumentNullException(nameof(currencyCrudService));
- _mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
- }
- [UnitOfWork(IsDisabled = true)]
- public void Execute(string exchangeId)
- {
- var exchange = _exchangeProvider.Get(exchangeId);
- var exchanges = _exchangeProvider.GetAll();
- IEnumerable<CurrencyDto> currencies = Enumerable.Empty<CurrencyDto>();
- bool isRequestError;
- int countErrors = 0;
- //Возможно из за большой загруженности или приоритетов в обработки команд, биржи иногда отклоняют запросы
- //Поэтому делается несколько попыток обращений
- do
- {
- try
- {
- isRequestError = false;
- currencies = (IEnumerable<CurrencyDto>)exchange.ExchangeDriver.CurrenciesAsync().Result;
- countErrors = 1000;
- }
- catch (JsonSerializationException e)
- {
- isRequestError = true;
- Debug.WriteLine($"{exchangeId} don't response {++countErrors} times when read currencies", e);
- Task.Delay(5000);
- }
- } while (isRequestError || countErrors <= 5);
- foreach (CurrencyDto currency in currencies)
- {
- ///Обязательно нужна блокировка на две операции чтения и записи, чтобы разные потоки
- /// не могли записать одну и ту же валюту в БД
- lock (locker)
- {
- var curr = _currencyRepository.FirstOrDefault(x => x.BrifName.ToUpper() == currency.BrifName.ToUpper());
- if (curr == null)
- {
- currency.BrifName = currency.BrifName.ToUpper();
- currency.Id = Guid.NewGuid();
- var currencyDto = _currencyCrudService.CreateAsync(_mapper.Map<CreateCurrencyDto>(currency)).Result;
- Console.WriteLine($"Валюта {currencyDto.BrifName.ToUpper()} добавлена в БД");
- }
- else
- {
- Console.WriteLine($"Валюта {currency.BrifName.ToUpper()} уже имеется в БД");
- }
- }
- }
- Console.WriteLine("Добавление валют в БД завершено");
- }
- protected override Task ExecuteAsync(CancellationToken stoppingToken)
- {
- throw new NotImplementedException();
- }
- }
- }
Add Comment
Please, Sign In to add comment