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); }
/// <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 )); }
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 )); }
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])); }
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); }
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); }