private async Task Consume() { var token = _cancellationToken.Token; var serializerSettings = JsonConverterExtensions.CreateSettings(); while (!token.IsCancellationRequested) { if (_consumer.Consume(out var message, 1000)) { var sw = Stopwatch.StartNew(); try { dynamic evnt = JsonConvert.DeserializeObject(message.Value, serializerSettings); if (evnt as IEvent == null) { continue; } evnt.Enrich(message.ToEventMetadata()); await _handler.HandleEvent(evnt); _logger.Debug($"Processed event {evnt.GetType().FullName} in {sw.ElapsedMilliseconds} ms."); } catch (JsonSerializationException e) { _logger.Error(e, "Could not deserialize event!"); } catch (Exception e) { _logger.Error(e, "Could not process event!"); } } } }
/// <summary> /// Will produce to Kafka and wait for delivery reports /// </summary> /// <param name="topic">The topic to produce to</param> /// <param name="events">The events to produce</param> /// <returns>Delivery reports for the produced events</returns> public async Task <EventMetadata[]> ProduceAsync(string topic, params IEvent[] events) { _logger.Information($"Producing {events.Length} events to {topic}.."); var sw = Stopwatch.StartNew(); var tasks = new List <Task <Message <Null, string> > >(); foreach (var evnt in events) { var content = JsonConverterExtensions.SerializeEvent(evnt); tasks.Add(_producer.ProduceAsync(topic, null, content)); } var result = await Task.WhenAll(tasks.ToArray()); _logger.Information($"Done producing {events.Length} in {sw.ElapsedMilliseconds} ms!"); sw.Stop(); return(result.Select(m => m.ToEventMetadata()).ToArray()); }