protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Starting event projector for type {EventType}", typeof(TEvent).Name); var topic = _topicNamingConvention.GetTopicName <TEvent>(); while (!stoppingToken.IsCancellationRequested) { // For some reason, without adding another "await" statement, the below async stream blocks // the main thread and won't start up the application. This is a workaround await Task.Delay(10, stoppingToken); try { await foreach (var msg in _streamConsumer.ConsumeAsync(topic, new ConsumerOptions()).WithCancellation(stoppingToken)) { var obj = JsonConvert.DeserializeObject <TEvent>(Encoding.UTF8.GetString(msg)); var tasks = new List <Task>(); foreach (IEventApplier <TEvent> applier in _eventAppliers) { tasks.Add(applier.ApplyAsync(obj)); } await Task.WhenAll(tasks); } } catch (Exception e) { _logger.LogCritical("Projector {ProjectorName} failed. Reason: {Message}. Stack Trace: {StackTrace}", GetType().FullName, e.Message, e.StackTrace); return; } } }
protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("Starting event consumer for type {EventType}", typeof(TEvent).Name); var topic = _topicNamingConvention.GetTopicName <TEvent>(); while (!stoppingToken.IsCancellationRequested) { try { var consumer = (IStreamConsumer)_serviceProvider.GetService(typeof(IStreamConsumer)); // For some reason, without adding another "await" statement, the below async stream blocks // the main thread and won't start up the application. This is a workaround await Task.Delay(10, stoppingToken); await foreach (var msg in consumer.ConsumeAsync(topic).WithCancellation(stoppingToken)) { _logger.LogDebug("Consumed message, length: {ByteLength}", msg.Length); _logger.LogDebug("Consumed message string: {ByteString}", Encoding.UTF8.GetString(msg)); var obj = JsonConvert.DeserializeObject <TEvent>(Encoding.UTF8.GetString(msg)); _logger.LogDebug("Consumed message id: {Id}", obj.Id); var handler = (IEventHandler <TEvent>)_serviceProvider.GetService(typeof(IEventHandler <TEvent>)); await handler.HandleAsync(obj); } } catch (Exception e) { _logger.LogCritical("Consumer {ConsumerName} failed. Reason: {Message}. Stack Trace: {StackTrace}", GetType().FullName, e.Message, e.StackTrace); return; } } }
public void Should_be_able_to_convert_class_name_to_kebab_case() { string name = _topicNamingConvention.GetTopicName <KebabCaseTopicNamingConventionSpecs>(); Assert.That(name, Is.EqualTo("kebab-case-topic-naming-convention-specs")); }
public async Task Add(int num) { _logger.LogInformation("Adding number..."); await _distributedLog.AppendAsync(_namingConvention.GetTopicName <NumberAdded>(), new NumberAdded { Num = num }); }