コード例 #1
0
        public static IHummingbirdEventBusHostBuilder AddKafka(this IHummingbirdEventBusHostBuilder hostBuilder, Action <KafkaOption> setupConnectionFactory)
        {
            setupConnectionFactory = setupConnectionFactory ?? throw new ArgumentNullException(nameof(setupConnectionFactory));

            var option = new KafkaOption();

            setupConnectionFactory(option);

            hostBuilder.Services.AddSingleton <ILoadBalancerFactory <IKafkaPersistentConnection> >(sp =>
            {
                return(new DefaultLoadBalancerFactory <IKafkaPersistentConnection>());
            });
            hostBuilder.Services.AddSingleton <IEventBus, EventBusKafka>(sp =>
            {
                var logger           = sp.GetRequiredService <ILogger <IEventBus> >();
                var loggerConnection = sp.GetRequiredService <ILogger <IKafkaPersistentConnection> >();
                var rabbitMQPersisterConnectionLoadBalancerFactory = sp.GetRequiredService <ILoadBalancerFactory <IKafkaPersistentConnection> >();
                var senderConnections  = new List <IKafkaPersistentConnection>();
                var receiveConnections = new List <IKafkaPersistentConnection>();

                //消费端连接池
                for (int i = 0; i < option.ReceiverMaxConnections; i++)
                {
                    var connection = new DefaultKafkaPersistentConnection(loggerConnection, option.ConsumerConfig);
                    //消费端的连接池
                    receiveConnections.Add(connection);
                }

                //发送端连接池
                for (int i = 0; i < option.SenderMaxConnections; i++)
                {
                    var connection = new DefaultKafkaPersistentConnection(loggerConnection, option.ProducerConfig);
                    senderConnections.Add(connection);
                }

                var receiveLoadBlancer = rabbitMQPersisterConnectionLoadBalancerFactory.Get(() => receiveConnections, option.ReceiverLoadBalancer);
                var senderLoadBlancer  = rabbitMQPersisterConnectionLoadBalancerFactory.Get(() => senderConnections, option.SenderLoadBalancer);

                return(new EventBusKafka(
                           receiveLoadBlancer,
                           senderLoadBlancer,
                           logger,
                           sp,
                           senderRetryCount: option.SenderAcquireRetryAttempts,
                           senderConfirmTimeoutMillseconds: option.SenderConfirmTimeoutMillseconds,
                           senderConfirmFlushTimeoutMillseconds: option.SenderConfirmFlushTimeoutMillseconds,
                           reveiverMaxDegreeOfParallelism: option.ReveiverMaxDegreeOfParallelism,
                           receiverAcquireRetryAttempts: option.ReceiverAcquireRetryAttempts,
                           receiverHandlerTimeoutMillseconds: option.ReceiverHandlerTimeoutMillseconds
                           ));
            });

            return(hostBuilder);
        }
コード例 #2
0
        public static IHummingbirdEventBusHostBuilder AddSqlServerEventLogging(this IHummingbirdEventBusHostBuilder hostBuilder, Action <SqlServerConfiguration> setupFactory)
        {
            #region 配置
            setupFactory = setupFactory ?? throw new ArgumentNullException(nameof(setupFactory));
            var configuration = new SqlServerConfiguration();
            setupFactory(configuration);
            #endregion

            hostBuilder.Services.AddTransient <SqlServerConfiguration>(a => configuration);
            hostBuilder.Services.AddTransient <IDbConnectionFactory>(a => new DbConnectionFactory(configuration.ConnectionString));
            hostBuilder.Services.AddTransient <IEventLogger, SqlServerEventLogger>();
            return(hostBuilder);
        }
コード例 #3
0
        public static IHummingbirdEventBusHostBuilder AddRabbitmq(this IHummingbirdEventBusHostBuilder hostBuilder, Action <RabbitMqOption> setupConnectionFactory)
        {
            setupConnectionFactory = setupConnectionFactory ?? throw new ArgumentNullException(nameof(setupConnectionFactory));

            var option = new RabbitMqOption();

            setupConnectionFactory(option);

            hostBuilder.Services.AddSingleton <IEventBus, EventBusRabbitMQ>(sp =>
            {
                var rabbitMQPersistentConnection = sp.GetRequiredService <IRabbitMQPersistentConnection>();

                var cache         = sp.GetRequiredService <Hummingbird.Extersions.Cache.IHummingbirdCache <bool> >();
                var Configuration = sp.GetRequiredService <IConfiguration>();
                var logger        = sp.GetRequiredService <ILogger <EventBusRabbitMQ> >();
                return(new EventBusRabbitMQ(cache,
                                            rabbitMQPersistentConnection,
                                            logger,
                                            sp,
                                            retryCount: option.RetryCount,
                                            preFetch: option.PreFetch,
                                            IdempotencyDuration: option.IdempotencyDuration,
                                            exchange: option.Exchange,
                                            exchangeType: option.ExchangeType
                                            ));
            });

            hostBuilder.Services.AddSingleton <IRabbitMQPersistentConnection>(sp =>
            {
                var Configuration = sp.GetRequiredService <IConfiguration>();
                var logger        = sp.GetRequiredService <ILogger <DefaultRabbitMQPersistentConnection> >();

                var factory         = new ConnectionFactory();
                factory.HostName    = option.HostName;
                factory.Port        = option.Port;
                factory.Password    = option.Password;
                factory.UserName    = option.UserName;
                factory.VirtualHost = option.VirtualHost;

                return(new DefaultRabbitMQPersistentConnection(factory, logger, option.RetryCount));
            });

            return(hostBuilder);
        }
コード例 #4
0
 public static IHummingbirdEventBusHostBuilder AddSqlServerEventLogging(this IHummingbirdEventBusHostBuilder hostBuilder, string ConnectionString)
 {
     hostBuilder.Services.AddTransient <IDbConnectionFactory>(a => new DbConnectionFactory(ConnectionString));
     hostBuilder.Services.AddTransient <IEventLogger, SqlServerEventLogger>();
     return(hostBuilder);
 }
コード例 #5
0
        public static IHummingbirdEventBusHostBuilder AddRabbitmq(this IHummingbirdEventBusHostBuilder hostBuilder, Action <RabbitMqOption> setupConnectionFactory)
        {
            setupConnectionFactory = setupConnectionFactory ?? throw new ArgumentNullException(nameof(setupConnectionFactory));

            var option = new RabbitMqOption();

            setupConnectionFactory(option);

            hostBuilder.Services.AddSingleton <IConnectionFactory>(sp =>
            {
                var logger = sp.GetRequiredService <ILogger <IConnectionFactory> >();

                var factory         = new ConnectionFactory();
                factory.Port        = option.Port;
                factory.Password    = option.Password;
                factory.UserName    = option.UserName;
                factory.VirtualHost = option.VirtualHost;
                factory.AutomaticRecoveryEnabled  = true;
                factory.TopologyRecoveryEnabled   = true;
                factory.UseBackgroundThreadsForIO = true;
                return(factory);
            });
            hostBuilder.Services.AddSingleton <ILoadBalancerFactory <IRabbitMQPersistentConnection> >(sp =>
            {
                return(new DefaultLoadBalancerFactory <IRabbitMQPersistentConnection>());
            });
            hostBuilder.Services.AddSingleton <IEventBus, EventBusRabbitMQ>(sp =>
            {
                var logger           = sp.GetRequiredService <ILogger <IEventBus> >();
                var loggerConnection = sp.GetRequiredService <ILogger <IRabbitMQPersistentConnection> >();
                var rabbitMQPersisterConnectionLoadBalancerFactory = sp.GetRequiredService <ILoadBalancerFactory <IRabbitMQPersistentConnection> >();
                var connectionFactory  = sp.GetRequiredService <IConnectionFactory>();
                var senderConnections  = new List <IRabbitMQPersistentConnection>();
                var receiveConnections = new List <IRabbitMQPersistentConnection>();
                var hosts = option.HostName.Split(',').ToList();

                //消费端连接池
                for (int i = 0; i < option.ReceiverMaxConnections; i++)
                {
                    var connection = new DefaultRabbitMQPersistentConnection(hosts, connectionFactory, loggerConnection, option.ReceiverAcquireRetryAttempts);
                    connection.TryConnect();
                    //消费端的连接池
                    receiveConnections.Add(connection);
                }

                //发送端连接池
                for (int i = 0; i < option.SenderMaxConnections; i++)
                {
                    var connection = new DefaultRabbitMQPersistentConnection(hosts, connectionFactory, loggerConnection, option.SenderAcquireRetryAttempts);
                    connection.TryConnect();
                    senderConnections.Add(connection);
                }

                var receiveLoadBlancer = rabbitMQPersisterConnectionLoadBalancerFactory.Get(() => receiveConnections, option.ReceiverLoadBalancer);
                var senderLoadBlancer  = rabbitMQPersisterConnectionLoadBalancerFactory.Get(() => senderConnections, option.SenderLoadBalancer);

                return(new EventBusRabbitMQ(
                           receiveLoadBlancer,
                           senderLoadBlancer,
                           logger,
                           sp,
                           senderRetryCount: option.SenderAcquireRetryAttempts,
                           senderConfirmTimeoutMillseconds: option.SenderConfirmTimeoutMillseconds,
                           reveiverMaxDegreeOfParallelism: option.ReveiverMaxDegreeOfParallelism,
                           receiverAcquireRetryAttempts: option.ReceiverAcquireRetryAttempts,
                           receiverHandlerTimeoutMillseconds: option.ReceiverHandlerTimeoutMillseconds,
                           preFetch: option.PreFetch,
                           exchange: option.Exchange,
                           exchangeType: option.ExchangeType
                           ));
            });

            return(hostBuilder);
        }