/// <summary> /// Create Producer to publish messages. /// </summary> /// <exception cref="BrokerFactoryException"></exception> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentException"></exception> /// <exception cref="ArgumentOutOfRangeException"></exception> public Task <IProducer <T> > CreateProducerAsync <T>(CancellationToken cancelToken = default) where T : class { MessageSettingsAttribute msgSettings = getAndValidateSettingsFor <T>(); try { // --> Create: Model. IModel model = _lazyConnection.Value.CreateModel(); // Create the requested exchange. if (!_factoryConfiguration.SkipManagement) { model.ExchangeDeclare(msgSettings.ExchangeName, msgSettings.ExchangeType.ToString().ToLower(), true); } model.ConfirmSelect(); // --> Create: Producer. IProducer <T> producer = new Producer <T>(model, msgSettings.ExchangeName, msgSettings.RouteKey, msgSettings.DeliveryMode); return(Task.FromResult(producer)); } catch (Exception ex) { throw new BrokerFactoryException("Failed to create Producer.", ex); } }
/// <summary> /// Create Consumer to consume messages. /// </summary> /// <exception cref="BrokerFactoryException"></exception> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentException"></exception> /// <exception cref="ArgumentOutOfRangeException"></exception> public Task <IConsumer <T> > CreateConsumerAsync <T>(CancellationToken cancelToken = default) where T : class { MessageSettingsAttribute msgSettings = getAndValidateSettingsFor <T>(); try { // --> Create: Model. IModel model = _lazyConnection.Value.CreateModel(); if (!_factoryConfiguration.SkipManagement) { // --> Initialize: DeadLetterQueue and DeadLetterExchange. string deadLetterQueue = _factoryConfiguration.DefaultDeadLetterQueue; if (!string.IsNullOrWhiteSpace(msgSettings.DeadLetterQueue)) { deadLetterQueue = msgSettings.DeadLetterQueue; } model.QueueDeclare(deadLetterQueue, true, false, false); model.ExchangeDeclare(_factoryConfiguration.DefaultDeadLetterExchange, ExchangeType.Direct.ToString().ToLower(), true); model.QueueBind(deadLetterQueue, _factoryConfiguration.DefaultDeadLetterExchange, msgSettings.QueueName); // --> Initialize: The requested Queue. Dictionary <string, object> declareArguments = new Dictionary <string, object> { ["x-dead-letter-exchange"] = _factoryConfiguration.DefaultDeadLetterExchange, ["x-dead-letter-routing-key"] = msgSettings.QueueName }; model.QueueDeclare(msgSettings.QueueName, true, false, false, declareArguments); // Create: Exchange and bind it with the queue. model.ExchangeDeclare(msgSettings.ExchangeName, msgSettings.ExchangeType.ToString().ToLower(), true); model.QueueBind(msgSettings.QueueName, msgSettings.ExchangeName, msgSettings.RouteKey ?? string.Empty); } // --> Create: Consumer. IConsumer <T> consumer = new Consumer <T>(model, msgSettings.QueueName, msgSettings.PrefetchCount); return(Task.FromResult(consumer)); } catch (Exception ex) { throw new BrokerFactoryException("Failed to create Consumer.", ex); } }