// For each message handler identified as being associated with an exchange/queue, create the // exchange and queue then bind it to the in-process handler. private async Task SubscribeToQueues(IBusModule busModule, IEnumerable <MessageQueueSubscriber> subscribers) { // Tacks the RPC queue that have been already bound. For a given named RPC queue, we only // want to bind once since the command action namespace is used to determine the actual // handler to be called (multiple commands are sent on a single queue). HashSet <string> boundToRpcQueues = new HashSet <string>(); foreach (var subscriber in subscribers) { busModule.ApplyQueueSettings(subscriber.QueueMeta); if (subscriber.QueueMeta.Exchange.IsRpcExchange && boundToRpcQueues.Contains(subscriber.QueueMeta.QueueName)) { continue; } var bus = busModule.GetBus(subscriber.QueueMeta.Exchange.BusName); IQueue queue = await QueueDeclareAsync(bus, subscriber.QueueMeta); ConsumeMessageQueue(bus, queue, subscriber); if (subscriber.QueueMeta.Exchange.IsRpcExchange) { boundToRpcQueues.Add(queue.Name); } } }
public RabbitMqPublisher(ILoggerFactory loggerFactory, IBusModule busModule, IPublisherModule publisherModule, ISerializationManager serializationManager, IEntityScriptingService scripting) { Logger = loggerFactory.CreateLogger <RabbitMqPublisher>(); BusModule = busModule ?? throw new ArgumentNullException(nameof(busModule)); PublisherModule = publisherModule ?? throw new ArgumentNullException(nameof(publisherModule)); Serialization = serializationManager ?? throw new ArgumentNullException(nameof(serializationManager)); Scripting = scripting ?? throw new ArgumentNullException(nameof(scripting)); }