public override void Register <TLargeMessageBodyStore>(PoorMansIoC container) { container.Register(c => { var uriFormatter = new UriFormatter(AzureBlobStorageContainerUri, AzureBlobStorageContainerSharedAccessSignature); var blobStorageHttpClient = container.ResolveWithOverrides <IAzureBlobStorageHttpClient>(uriFormatter); var messageBodyStore = container.ResolveWithOverrides <AzureBlobStorageHttpLargeMessageBodyStore>(blobStorageHttpClient); return(messageBodyStore); }, ComponentLifetime.SingleInstance, typeof(ILargeMessageBodyStore)); }
public IEnumerable <IMessagePump> CreateAll() { var openGenericHandlerType = typeof(IHandleRequest <,>); var handlerTypes = _typeProvider.RequestHandlerTypes.ToArray(); // Create a single connection to each request queue determined by routing var allMessageTypesHandledByThisEndpoint = _handlerMapper.GetMessageTypesHandledBy(openGenericHandlerType, handlerTypes); var bindings = allMessageTypesHandledByThisEndpoint .Select(m => new { MessageType = m, QueuePath = _router.Route(m, QueueOrTopic.Queue, _pathFactory) }) .GroupBy(b => b.QueuePath) .Select(g => new { QueuePath = g.Key, HandlerTypes = g.SelectMany(x => _handlerMapper.GetHandlerTypesFor(openGenericHandlerType, x.MessageType)) }); // Each binding to a queue can handle one or more request types depending on the routes that are defined foreach (var binding in bindings) { var messageTypes = _handlerMapper.GetMessageTypesHandledBy(openGenericHandlerType, binding.HandlerTypes).ToArray(); _logger.Debug("Creating message pump for request queue '{0}' handling {1}", binding.QueuePath, messageTypes.ToTypeNameSummary(selector: t => t.Name)); var messageReceiver = _transport.GetQueueReceiver(binding.QueuePath); var handlerMap = _handlerMapper.GetHandlerMapFor(openGenericHandlerType, messageTypes); var messageDispatcher = _messageDispatcherFactory.Create(openGenericHandlerType, handlerMap); var pump = _container.ResolveWithOverrides <MessagePump>(messageReceiver, messageDispatcher); GarbageMan.Add(pump); yield return(pump); } }
public IMessagePump Create() { var pump = _container.ResolveWithOverrides <MessagePump>(_transport.GetQueueReceiver(_replyQueueName), _responseMessageDispatcher); GarbageMan.Add(pump); return(pump); }
internal static Bus Build(BusBuilderConfiguration configuration) { var logger = configuration.Logger; logger.Debug("Constructing bus..."); configuration.AssertConfigurationIsValid(); var container = new PoorMansIoC(); container.RegisterPropertiesFromConfigurationObject(configuration); logger.Debug("Creating message pumps..."); var messagePumpsManager = new MessagePumpsManager( container.Resolve<ResponseMessagePumpFactory>().Create(), container.Resolve<RequestMessagePumpsFactory>().CreateAll(), container.Resolve<CommandMessagePumpsFactory>().CreateAll(), container.Resolve<MulticastRequestMessagePumpsFactory>().CreateAll(), container.Resolve<MulticastEventMessagePumpsFactory>().CreateAll(), container.Resolve<CompetingEventMessagePumpsFactory>().CreateAll()); logger.Debug("Message pumps are all created."); var bus = container.ResolveWithOverrides<Bus>(messagePumpsManager); container.Resolve<PropertyInjector>().Bus = bus; bus.Starting += (s, e) => { Task.Run(async () => { try { await container.Resolve<INimbusTransport>().TestConnection(); await CleanNamespace(container, logger); } catch (Exception ex) { logger.Error(ex, "Failed to establish connection to underlying transport: {Message}", ex.Message); throw; } }).Wait(); }; bus.Disposing += (s, e) => { Task.Run(async () => { await CleanNamespace(container, logger); container.Dispose(); }).Wait(); }; logger.Info("Bus built. Job done!"); return bus; }
public IEnumerable <IMessagePump> CreateAll() { var openGenericHandlerType = typeof(IHandleMulticastRequest <,>); var handlerTypes = _typeProvider.MulticastRequestHandlerTypes.ToArray(); // Events are routed to Topics and we'll create a competing subscription for the logical endpoint var allMessageTypesHandledByThisEndpoint = _handlerMapper.GetMessageTypesHandledBy(openGenericHandlerType, handlerTypes); var bindings = allMessageTypesHandledByThisEndpoint .Select(m => new { MessageType = m, TopicPath = _router.Route(m, QueueOrTopic.Topic, _pathFactory) }) .GroupBy(b => b.TopicPath) .Select(g => new { TopicPath = g.Key, MessageTypes = g.Select(x => x.MessageType), HandlerTypes = g.SelectMany(x => _handlerMapper.GetHandlerTypesFor(openGenericHandlerType, x.MessageType)) }) .ToArray(); if (bindings.Any(b => b.MessageTypes.Count() > 1)) { throw new NotSupportedException("Routing multiple message types through a single Topic is not supported."); } foreach (var binding in bindings) { foreach (var handlerType in binding.HandlerTypes) { var messageType = binding.MessageTypes.Single(); var subscriptionName = _pathFactory.SubscriptionNameFor(_applicationName, handlerType); var filterCondition = _filterConditionProvider.GetFilterConditionFor(handlerType); _logger.Debug("Creating message pump for multicast request subscription '{0}/{1}' handling {2} with filter {3}", binding.TopicPath, subscriptionName, messageType, filterCondition); var messageReceiver = _transport.GetTopicReceiver(binding.TopicPath, subscriptionName, filterCondition); var handlerMap = new Dictionary <Type, Type[]> { { messageType, new[] { handlerType } } }; var messageDispatcher = _messageDispatcherFactory.Create(openGenericHandlerType, handlerMap); var pump = _container.ResolveWithOverrides <MessagePump>(messageReceiver, messageDispatcher); GarbageMan.Add(pump); yield return(pump); } } }
internal static Bus Build(BusBuilderConfiguration configuration) { var logger = configuration.Logger; logger.Debug("Constructing bus..."); configuration.AssertConfigurationIsValid(); var container = new PoorMansIoC(); container.RegisterPropertiesFromConfigurationObject(configuration); logger.Debug("Creating message pumps..."); var messagePumpsManager = new MessagePumpsManager( container.Resolve<ResponseMessagePumpFactory>().Create(), container.Resolve<RequestMessagePumpsFactory>().CreateAll(), container.Resolve<CommandMessagePumpsFactory>().CreateAll(), container.Resolve<MulticastRequestMessagePumpsFactory>().CreateAll(), container.Resolve<MulticastEventMessagePumpsFactory>().CreateAll(), container.Resolve<CompetingEventMessagePumpsFactory>().CreateAll()); logger.Debug("Message pumps are all created."); var bus = container.ResolveWithOverrides<Bus>(messagePumpsManager); container.Resolve<PropertyInjector>().Bus = bus; bus.Starting += delegate { container.Resolve<INimbusTransport>().TestConnection().Wait(); var removeAllExistingElements = container.Resolve<RemoveAllExistingNamespaceElementsSetting>(); if (removeAllExistingElements) { logger.Debug("Removing all existing namespace elements. IMPORTANT: This should only be done in your regression test suites."); var cleanser = container.Resolve<INamespaceCleanser>(); cleanser.RemoveAllExistingNamespaceElements().Wait(); } }; bus.Disposing += delegate { container.Dispose(); }; logger.Info("Bus built. Job done!"); return bus; }
public INimbusMessageSender GetQueueSender(string queuePath) { var queue = _messageStore.GetQueue(queuePath); return(_container.ResolveWithOverrides <InProcessQueueSender>(queue)); }
public INimbusMessageSender GetQueueSender(string queuePath) { return(_container.ResolveWithOverrides <RedisMessageSender>(queuePath)); }