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