private async void NumberReceivedEventHandler(object?sender, NumberGeneratedEventArgs e) { _logger.LogInformation($"Number received: {e.Number}"); var isPersisted = false; while (!isPersisted) { try { _logger.LogInformation($"Trying to persist number: {e.Number}"); using (var scope = _scopeFactory.CreateScope()) { var numberProcessor = scope.ServiceProvider.GetRequiredService <INumberProcessor>(); await numberProcessor.PersistAsync(e.Number); } isPersisted = true; } catch (Exception ex) { _logger.LogInformation($"Could not persist this number: {e.Number}, will try again later. Details: {ex}"); await Task.Delay(1000); } } }
private async void OnNumberGenerated(object sender, NumberGeneratedEventArgs e) { try { _logger.LogDebug($"{nameof(OnNumberGenerated)}: {e.Number}"); var repo = new RandomNumber(e.Number); _repository.Add(repo); if (await _repository.SaveChangesAsync()) { _logger.LogDebug($"{nameof(OnNumberGenerated)}: {e.Number} saved to DB"); } else { _logger.LogWarning($"Failed to save to DB {nameof(OnNumberGenerated)}"); } if (e.Number > 800) { CancellationToken cts = new CancellationTokenSource().Token; //post to endpoint var dto = new NumberDto { Id = repo.RandomNumberId, Number = repo.Number, CreatedAt = repo.CreatedAt }; var json = JsonConvert.SerializeObject(dto); var data = new StringContent(json, Encoding.UTF8, "application/json"); var response = await _clientLocal.PostAsync("api/numbers", data, cts).ConfigureAwait(false); if (response.IsSuccessStatusCode) { //may be log } else { _logger.LogDebug($"StatusCode {response.StatusCode.ToString()} during posting message {dto.ToString()}"); return; } } } catch (Exception ex) { _logger.LogError(ex, $"Error in {nameof(OnNumberGenerated)}"); } }
private void NumberGenerator_NumberGenerated(object sender, NumberGeneratedEventArgs e) { Log.Info($"Number generated: {e.Number} "); lock (_lockObject) { var randonNumber = new RandomNumber { Value = e.Number, GeneratedTime = DateTime.UtcNow }; randonNumber.ServiceCallRetryRequired = !CallServiceForLargeNumberNotification(randonNumber).Result; //instead of saving everything in one batch I am saving per item in case an error interrupts the process and we have a record of what was already generated using (var numberRepository = new RandomNumberRepository()) { numberRepository.AddRandomNumber(randonNumber); numberRepository.Save(); } } }
void generator_NumberGenerated(object sender, NumberGeneratedEventArgs e) { var number = new Number(e.Execution, e.BatchSequence, e.Number); Assert.True(number.Value > 0); }
private static void NumberGenerator_NumberGenerated(object sender, NumberGeneratedEventArgs e) { Console.WriteLine($"Number generated {e.Number}"); }