예제 #1
0
        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;
                }
            }
        }
예제 #2
0
        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"));
        }
예제 #4
0
        public async Task Add(int num)
        {
            _logger.LogInformation("Adding number...");

            await _distributedLog.AppendAsync(_namingConvention.GetTopicName <NumberAdded>(), new NumberAdded { Num = num });
        }