public async Task <RetryDepositResponse> RetryDeposit(RetryDepositRequest request) { using var activity = MyTelemetry.StartActivity("Handle deposit manual retry") .AddTag("DepositId", request.DepositId); _logger.LogInformation("Handle deposit manual retry: {depositId}", request.DepositId); try { await using var context = new DatabaseContext(_dbContextOptionsBuilder.Options); var deposit = await context.Deposits.FindAsync(request.DepositId); if (deposit == null) { _logger.LogInformation("Unable to find deposit with id {depositId}", request.DepositId); return(new RetryDepositResponse { Success = false, ErrorMessage = "Unable to find deposit", DepositId = request.DepositId }); } if (deposit.Status == DepositStatus.Processed) { _logger.LogInformation("Deposit {depositId} already processed", request.DepositId); return(new RetryDepositResponse { Success = true, DepositId = request.DepositId }); } var changeBalanceRequest = new BlockchainDepositGrpcRequest { WalletId = deposit.WalletId, ClientId = deposit.ClientId, Amount = deposit.Amount, AssetSymbol = deposit.AssetSymbol, BrokerId = deposit.BrokerId, Integration = deposit.Integration, TransactionId = deposit.MatchingEngineId, Comment = deposit.Comment, Txid = deposit.Txid }; var resp = await _changeBalanceService.BlockchainDepositAsync(changeBalanceRequest); if (!resp.Result) { _logger.LogError("Cannot deposit to ME. Error: {errorText}", resp.ErrorMessage); deposit.RetriesCount++; deposit.LastError = resp.ErrorMessage; if (deposit.RetriesCount >= Program.ReloadedSettings(e => e.DepositsRetriesLimit).Invoke()) { deposit.Status = DepositStatus.Error; } } deposit.MatchingEngineId = resp.TransactionId; deposit.Status = DepositStatus.Processed; await context.UpdateAsync(new List <DepositEntity> { deposit }); _logger.LogInformation("Handled deposit manual retry: {depositId}", request.DepositId); return(new RetryDepositResponse { Success = true, DepositId = request.DepositId }); } catch (Exception ex) { _logger.LogError(ex, "Cannot Handle deposits"); ex.FailActivity(); return(new RetryDepositResponse { Success = false, ErrorMessage = $"Internal error {ex.Message}", DepositId = request.DepositId }); } }
private async Task DoTime() { using var activity = MyTelemetry.StartActivity("Handle deposits"); try { await using var context = new DatabaseContext(_dbContextOptionsBuilder.Options); var sw = new Stopwatch(); sw.Start(); var deposits = await context.Deposits.Where(e => e.Status == DepositStatus.New).ToListAsync(); foreach (var deposit in deposits) { var request = new BlockchainDepositGrpcRequest { WalletId = deposit.WalletId, ClientId = deposit.ClientId, Amount = deposit.Amount, AssetSymbol = deposit.AssetSymbol, BrokerId = deposit.BrokerId, Integration = deposit.Integration, TransactionId = deposit.MatchingEngineId, Comment = deposit.Comment, Txid = deposit.Txid }; var resp = await _changeBalanceService.BlockchainDepositAsync(request); if (!resp.Result) { _logger.LogError("Cannot deposit to ME. Error: {errorText}", resp.ErrorMessage); deposit.RetriesCount++; deposit.LastError = resp.ErrorMessage; if (deposit.RetriesCount >= Program.ReloadedSettings(e => e.DepositsRetriesLimit).Invoke()) { deposit.Status = DepositStatus.Error; await _depositPublisher.PublishAsync(new Deposit(deposit)); } continue; } deposit.MatchingEngineId = resp.TransactionId; deposit.Status = DepositStatus.Processed; await _depositPublisher.PublishAsync(new Deposit(deposit)); } await context.UpdateAsync(deposits); deposits.Count.AddToActivityAsTag("deposits-count"); sw.Stop(); if (deposits.Count > 0) { _logger.LogInformation("Handled {countTrade} deposits. Time: {timeRangeText}", deposits.Count, sw.Elapsed.ToString()); } } catch (Exception ex) { _logger.LogError(ex, "Cannot Handle deposits"); ex.FailActivity(); throw; } _timer.ChangeInterval( TimeSpan.FromSeconds(Program.ReloadedSettings(e => e.DepositsProcessingIntervalSec).Invoke())); }