/// <summary> /// The resolve for. /// </summary> /// <param name="configuration"> /// The configuration. /// </param> /// <returns> /// The <see cref="Producer"/>. /// </returns> public Producer ResolveFor(ISenderConfiguration configuration) { Producer producer = this.TryResolverFor(configuration.Label); if (producer == null) { using (RabbitChannel channel = this._bus.OpenChannel()) { var topologyBuilder = new TopologyBuilder(channel); var builder = new RouteResolverBuilder(this._bus.Endpoint, topologyBuilder, configuration); Maybe<Func<IRouteResolverBuilder, IRouteResolver>> routeResolverBuilder = configuration.Options.GetRouteResolverBuilder(); Assumes.True(routeResolverBuilder.HasValue, "RouteResolverBuilder must be set for [{0}]", configuration.Label); IRouteResolver routeResolver = routeResolverBuilder.Value(builder); producer = new Producer(this._bus, configuration.Label, routeResolver, configuration.Options.IsConfirmationRequired()); producer.Failed += p => { { // lock (_producers) p.Dispose(); this._producers.Remove(p.Label); } }; // lock (_producers) this._producers.Add(configuration.Label, producer); } if (configuration.RequiresCallback) { producer.UseCallbackListener(this._bus.ListenerRegistry.ResolveFor(configuration.CallbackConfiguration)); } } return producer; }
/// <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; } } }