private Listener BuildListener(string url) { var reuseConnectionProperty = this.receiverOptions.GetReuseConnection(); var reuseConnection = reuseConnectionProperty.HasValue && reuseConnectionProperty.Value; var source = new CancellationTokenSource(); var connection = this.connectionPool.Get(url, reuseConnection, source.Token); this.logger.Trace($"Using connection [{connection.Id}] at URL=[{url}] to resolve a listener"); using (var topologyBuilder = new TopologyBuilder(connection)) { var builder = new SubscriptionEndpointBuilder(this.bus.Endpoint, topologyBuilder, this.Configuration); var endpointBuilder = this.Configuration.Options.GetEndpointBuilder(); Assumes.True(endpointBuilder != null, "EndpointBuilder is null for [{0}].", this.Configuration.Label); var endpoint = endpointBuilder.Value(builder); var newListener = new Listener( this.bus, connection, endpoint, this.receiverOptions, this.bus.Configuration.ValidatorRegistry); return(newListener); } }
/// <summary> /// The resolve for. /// </summary> /// <param name="configuration"> /// The configuration. /// </param> /// <returns> /// The <see cref="Listener"/>. /// </returns> public Listener ResolveFor(IReceiverConfiguration configuration) { using (RabbitChannel channel = this.bus.OpenChannel()) { var topologyBuilder = new TopologyBuilder(channel); var builder = new SubscriptionEndpointBuilder(this.bus.Endpoint, topologyBuilder, configuration); Maybe <Func <ISubscriptionEndpointBuilder, ISubscriptionEndpoint> > endpointBuilder = configuration.Options.GetEndpointBuilder(); Assumes.True(endpointBuilder != null, "EndpointBuilder is null for [{0}].", configuration.Label); ISubscriptionEndpoint endpoint = endpointBuilder.Value(builder); lock (this.listeners) { Listener listener = this.listeners.FirstOrDefault(l => l.Endpoint.ListeningSource.Equals(endpoint.ListeningSource)); if (listener == null) { listener = new Listener(this.bus, endpoint, (RabbitReceiverOptions)configuration.Options, this.bus.Configuration.ValidatorRegistry); this.listeners.Add(listener); } else { EnsureConfigurationIsCompatible(listener, configuration); } return(listener); } } }
/// <summary> /// Builds a set of listeners constructing one listener for each URL in the connection string /// </summary> private void BuildListeners() { var reuseConnectionProperty = this.receiverOptions.GetReuseConnection(); var reuseConnection = reuseConnectionProperty.HasValue && reuseConnectionProperty.Value; this.logger.Trace( $"Building listeners of [{this.Configuration.Label}]:\r\n\t{string.Join("\r\n\t", this.receiverOptions.RabbitConnectionString.Select(url => $"Listener({this.Configuration.Label}): URL\t=>\t{url}"))}"); foreach (var url in this.receiverOptions.RabbitConnectionString) { var source = new CancellationTokenSource(); var connection = this.connectionPool.Get(url, reuseConnection, source.Token); this.logger.Trace($"Using connection [{connection.Id}] at URL=[{url}] to resolve a listener"); var topologyBuilder = new TopologyBuilder(connection.OpenChannel()); var builder = new SubscriptionEndpointBuilder(this.bus.Endpoint, topologyBuilder, this.Configuration); var endpointBuilder = this.Configuration.Options.GetEndpointBuilder(); Assumes.True(endpointBuilder != null, "EndpointBuilder is null for [{0}].", this.Configuration.Label); var endpoint = endpointBuilder.Value(builder); var newListener = new Listener( this.bus, connection, endpoint, this.receiverOptions, this.bus.Configuration.ValidatorRegistry); // There is no need to register another listener at the same URL and for the same source; consuming actions can be registered for a single listener var listener = this.listeners.FirstOrDefault( l => l.BrokerUrl == newListener.BrokerUrl && newListener.Endpoint.ListeningSource.Equals(l.Endpoint.ListeningSource)); if (listener == null) { listener = newListener; this.listeners.Add(listener); } else { // Check if an existing listener can be a substitute for a new one and if so just skip the new listeners this.CheckIfCompatible(newListener); listener = newListener; } // This event should be fired always, no matter if a listener already existed; this will ensure the event will be handled outside (in the bus) this.ListenerRegistered(this, new ListenerRegisteredEventArgs(listener)); } }