Ejemplo n.º 1
0
        public static KafkaBuilder AddConsumer <TConsumerClient, TKey, TValue>(
            this KafkaBuilder kafkaBuilder,
            Action <IServiceProvider, ConsumerConnectionBuilder <TKey, TValue> > optionsAction
            )
            where TConsumerClient : class, IConsumerClient <TKey, TValue>
        {
            var services = kafkaBuilder.Services;

            services.AddSingleton <TConsumerClient>();

            services.AddSingleton <IHostedService>(s =>
            {
                var logger = s.GetService <IServiceBusLogger>();
                var loggerServiceHosted = s.GetService <ILogger <DefaultConsumerHostedService <TKey, TValue> > >();
                var client = s.GetRequiredService <TConsumerClient>();
                var config = s.GetService <IOptions <KafkaConfig> >();
                var cb     = new ConsumerConnectionBuilder <TKey, TValue>(config.Value.CertificatePath);

                optionsAction(s, cb);

                var topicConsumer = TopicFactory.GetTopicConsumer(client, cb, logger);
                return(new DefaultConsumerHostedService <TKey, TValue>(topicConsumer, loggerServiceHosted));
            });

            return(kafkaBuilder);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Esse método apenas redireciona uma mensagem para outro tópico.
        /// </summary>
        public static TopicConsumer <TKey, TValue> GetTopicConsumerWithRedirectMessage <TKey, TValue>(
            IConsumerClient <TKey, TValue> client,
            ConsumerConnectionBuilder <TKey, TValue> cb,
            IServiceBusLogger logger
            )
        {
            var producerSender = GetResendProducerSender(cb, logger);

            // Cria o consumidor
            var consumer       = cb.Build();
            var consumerConfig = cb.GetConsumerConfig();

            var redirect = new RedirectConsumerClient <TKey, TValue>(
                cb.RetryTopic,
                cb.Delay,
                client,
                producerSender,
                logger
                );

            return(new TopicConsumer <TKey, TValue>(
                       cb.Topic,
                       consumerConfig,
                       consumer,
                       redirect,
                       logger
                       ));
        }
Ejemplo n.º 3
0
        public static TopicConsumer <TKey, TValue> GetTopicConsumerWithRetry <TKey, TValue>(
            IConsumerClient <TKey, TValue> client,
            ConsumerConnectionBuilder <TKey, TValue> cb,
            IServiceBusLogger logger
            )
        {
            var producerSender = GetResendProducerSender(cb, logger);

            // Cria o consumidor
            var consumer       = cb.Build();
            var consumerConfig = cb.GetConsumerConfig();

            var retryConsumerClient = new RetryConsumerClient <TKey, TValue>(
                cb.RetryTopic,
                consumerConfig.GroupId, // Deve ser, obrigatoriamente, o mesmo groupId do tópico original
                cb.Delay,
                client,
                producerSender,
                logger
                );

            return(new TopicConsumer <TKey, TValue>(
                       cb.Topic,
                       consumerConfig,
                       consumer,
                       retryConsumerClient,
                       logger
                       ));
        }
Ejemplo n.º 4
0
        public IActionResult Subscribe(
            string appName,
            bool simulateError,
            [FromBody] ConsumerOptions settings,
            [FromServices] IServiceBusLogger loggerServiceBus,
            [FromServices] ILogger <SignalRConsumerClient> loggerSignalR
            )
        {
            if (!subscribersCancels.ContainsKey(appName))
            {
                TopicConsumer <Guid, EventMessage> topicConsumer;
                var cancelSource = new CancellationTokenSource();
                var builder      = new ConsumerConnectionBuilder <Guid, EventMessage>(settings.IgnoreSsl ? null : this._appConfiguration.Kafka.CertificatePath);
                builder.WithBrokers(settings.BootstrapServers);
                builder.WithTopic(settings.Topic);
                builder.WithGroupId(settings.GroupId);
                builder.WithRetry(settings.RetryTopic, settings.Delay);
                builder.AutoOffSetReset(settings.AutoOffSetReset);
                builder.EnableAutoCommit(settings.EnableAutoCommit);
                builder.EnablePartitionEof(settings.EnablePartitionEof);
                //builder.MaxPollIntervalMs(settings.MaxPollIntervalMs);
                builder.WithJsonSerializer();

                var appInfo = new AppInfo
                {
                    AppName           = appName,
                    CancellationToken = cancelSource,
                    SimulateError     = simulateError,
                    Settings          = settings
                };

                var client = new SignalRConsumerClient(appInfo, _kafkaHubContext, loggerSignalR);

                switch (settings.RetryStrategy)
                {
                case "retry":
                    topicConsumer = TopicFactory.GetTopicConsumerWithRetry(client, builder, loggerServiceBus);
                    break;

                case "redirect":
                    topicConsumer = TopicFactory.GetTopicConsumerWithRedirectMessage(client, builder, loggerServiceBus);
                    break;

                default:     // Only consume
                    topicConsumer = TopicFactory.GetTopicConsumer(client, builder, loggerServiceBus);
                    break;
                }

                var task = topicConsumer.Run(cancelSource.Token);

                appInfo.TaskId = task.Id;
                subscribersCancels.TryAdd(appName, appInfo);
                return(Ok(appInfo));
            }

            return(Ok(subscribersCancels[appName]));
        }
Ejemplo n.º 5
0
        public static TopicConsumer <TKey, TValue> GetTopicConsumer <TKey, TValue>(
            IConsumerClient <TKey, TValue> client,
            ConsumerConnectionBuilder <TKey, TValue> cb,
            IServiceBusLogger logger
            )
        {
            var consumer = cb.Build();

            var topicConsumer = new TopicConsumer <TKey, TValue>(
                cb.Topic,
                cb.GetConsumerConfig(),
                consumer,
                client,
                logger
                );

            return(topicConsumer);
        }
Ejemplo n.º 6
0
        private static ProducerSyncSender <TKey, TValue> GetResendProducerSender <TKey, TValue>(ConsumerConnectionBuilder <TKey, TValue> cb, IServiceBusLogger logger)
        {
            // Cria o produtor com o mesmo endereço do consumidor (isso pode melhorar)
            var produtorBuilder = new ProducerConnectionBuilder <TKey, TValue>(cb.CaPath);
            var producer        = produtorBuilder
                                  .WithBootstrapServers(cb.GetConsumerConfig().BootstrapServers)
                                  .WithAsyncProducer()
                                  .WithJsonSerializer()
                                  .Build();

            var producerSender = new ProducerSyncSender <TKey, TValue>(producer, new NullProducerClient <TKey, TValue>(logger), logger);

            return(producerSender);
        }