Example #1
0
        /// <summary>
        /// Common initialization code.
        /// </summary>
        protected virtual void Initialize(Dictionary <string, string> configuration, ZeroMqSocketType socketType, bool isInbound, IQueueLogger loggerObject = null)
        {
            try
            {
                #region Logger Initialization
                logger = loggerObject;
                #endregion

                #region Parameters Collection
                zmqConfiguration = CommonItems.CollectZmqConfiguration(ref configuration, isInbound, ref logger);
                #endregion

                #region Creating Socket
                InitializeZeroMqSocket(socketType, isInbound);
                #endregion
            }
            catch (Exception ex) when(!(ex is QueueException))
            {
                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          errorCode: QueueErrorCode.FailedToInitializeMessageQueue,
                          message: ErrorMessages.FailedToInitializeMessageQueue,
                          innerException: ex,
                          queueContext: CommonItems.ZeroMqName,
                          address: zmqConfiguration.Address,
                          logger: logger);
            }
        }
        public ZmqInboundRaR(Dictionary <string, string> configuration, IQueueLogger loggerObject)
        {
            try
            {
                #region Initialization
                base.Initialize(configuration, ZeroMqSocketType.Router, true, loggerObject);

                // Setting fields.
                Address = zmqConfiguration.Address;

                // Binding on receive event.
                base.socket.ReceiveReady += ReceiveReady;

                // Initializing poller.
                poller = new NetMQPoller();
                poller.RunAsync();
                #endregion
            }
            catch (Exception ex) when(!(ex is QueueException))
            {
                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          errorCode: QueueErrorCode.FailedToInitializeMessageQueue,
                          message: ErrorMessages.FailedToInitializeMessageQueue,
                          innerException: ex,
                          queueContext: CommonItems.ZeroMqName,
                          address: zmqConfiguration?.Address,
                          logger: logger);
            }
        }
        public SbInboundFaF(Dictionary <string, string> configuration, IQueueLogger loggerObject)
        {
            try
            {
                #region Initialization
                base.Initialize(configuration, true, loggerObject);

                // Setting other fields.
                Address = sbConfiguration.Address;

                // Creating queue client for acknowledgment.
                if (sbConfiguration.Acknowledgment)
                {
                    acknowledgmentQueueClient = queueClient.MessagingFactory.CreateQueueClient(sbConfiguration.QueueName);
                }
                #endregion
            }
            catch (Exception ex) when(!(ex is QueueException))
            {
                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          errorCode: QueueErrorCode.FailedToInitializeMessageQueue,
                          message: ErrorMessages.FailedToInitializeMessageQueue,
                          innerException: ex,
                          queueContext: CommonItems.ServiceBusName,
                          queueName: sbConfiguration.QueueName,
                          address: sbConfiguration.Address,
                          logger: logger);
            }
        }
 public ZmqMessageReceiveOptions(ref IQueueLogger loggerObject)
 {
     #region Initialization
     logger = loggerObject;
     IsAcknowledgmentConfigured = false; // Acknowledgment is not supported yet in ZeroMq.
     #endregion
 }
Example #5
0
        public ZmqOutboundRaR(Dictionary <string, string> configuration, IQueueLogger loggerObject)
        {
            try
            {
                #region Initialization
                base.Initialize(configuration, ZeroMqSocketType.Dealer, false, loggerObject);

                // Setting fields.
                Address = zmqConfiguration.Address;

                // Need to set some unique identifier for connection identity (ZeroMq requirement).
                socketIdentity          = Guid.NewGuid().ToString("N");
                socket.Options.Identity = Encoding.Unicode.GetBytes(socketIdentity);

                // Binding on receive event.
                socket.ReceiveReady += ResponseReady;

                // Initializing poller and starting it.
                poller = new NetMQPoller {
                    socket
                };
                poller.RunAsync();
                #endregion
            }
            catch (Exception ex) when(!(ex is QueueException))
            {
                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          errorCode: QueueErrorCode.FailedToInitializeMessageQueue,
                          message: ErrorMessages.FailedToInitializeMessageQueue,
                          innerException: ex,
                          queueContext: CommonItems.ZeroMqName,
                          address: zmqConfiguration?.Address,
                          logger: logger);
            }
        }
 internal ZmqRequestMessage(NetMQFrame clientAddress, NetMQSocket responseChannel, TRequest requestData, ref IQueueLogger loggerObject)
 {
     #region Initialization
     logger               = loggerObject;
     RequestData          = requestData;
     this.clientAddress   = clientAddress;
     this.responseChannel = responseChannel;
     #endregion
 }
Example #7
0
 public RmqMessageReceiveOptions(IModel model, ulong deliveryTag, string queueName, bool isAcknowledgmentConfigured, ref IQueueLogger logger)
 {
     #region Initialization
     this.model                 = model;
     this.logger                = logger;
     this.queueName             = queueName;
     this.deliveryTag           = deliveryTag;
     IsAcknowledgmentConfigured = isAcknowledgmentConfigured;
     #endregion
 }
Example #8
0
 public SbMessageReceiveOptions(Guid lockToken, string queueName, bool isAcknowledgmentConfigured, ref QueueClient queueClient, ref IQueueLogger loggerObject)
 {
     #region Initialization
     this.queueName             = queueName;
     this.logger                = loggerObject;
     this.lockToken             = lockToken;
     this.queueClient           = queueClient;
     IsAcknowledgmentConfigured = isAcknowledgmentConfigured;
     #endregion
 }
Example #9
0
        /// <summary>
        /// Common initialization code.
        /// </summary>
        protected virtual void Initialize(Dictionary <string, string> configuration, bool isInbound, IQueueLogger loggerObject = null)
        {
            try
            {
                #region Logger Initialization
                logger = loggerObject;
                #endregion

                #region Parameters Collection
                sbConfiguration = CommonItems.CollectSbConfiguration(ref configuration, isInbound, ref logger);
                #endregion

                #region Initializing Queue
                queueClient = QueueClient.CreateFromConnectionString(sbConfiguration.Address);

                if (!string.IsNullOrWhiteSpace(sbConfiguration.NamespaceAddress))
                {
                    namespaceManager = NamespaceManager.CreateFromConnectionString(sbConfiguration.NamespaceAddress);
                }

                // Updating address field to remove confidential data.
                sbConfiguration.Address          = sbConfiguration.Address?.Split(';')?.FirstOrDefault(x => x.StartsWith(CommonItems.SbConnectionStringAddressPartName, StringComparison.InvariantCultureIgnoreCase));
                sbConfiguration.NamespaceAddress = sbConfiguration.NamespaceAddress?.Split(';')?.FirstOrDefault(x => x.StartsWith(CommonItems.SbConnectionStringAddressPartName, StringComparison.InvariantCultureIgnoreCase));

                if (!IsQueueExistsHelper())
                {
                    throw MessageQueueCommonItems.PrepareAndLogQueueException(
                              errorCode: QueueErrorCode.QueueDoesNotExist,
                              message: ErrorMessages.QueueDoesNotExist,
                              innerException: null,
                              queueContext: CommonItems.ServiceBusName,
                              queueName: sbConfiguration.QueueName,
                              address: sbConfiguration.Address,
                              logger: logger);
                }

                // Updating flag.
                isInitialized = true;
                #endregion
            }
            catch (Exception ex) when(!(ex is QueueException))
            {
                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          errorCode: QueueErrorCode.FailedToInitializeMessageQueue,
                          message: ErrorMessages.FailedToInitializeMessageQueue,
                          innerException: ex,
                          queueContext: CommonItems.ServiceBusName,
                          queueName: sbConfiguration.QueueName,
                          address: sbConfiguration.Address,
                          logger: logger);
            }
        }
 internal RmqRequestMessage(IModel model, IBasicProperties replyProperties, string exchange, string routingKey, bool acknowledgment, ulong deliveryTag, TRequest requestData, ref IQueueLogger logger)
 {
     #region Initialization
     RequestData          = requestData;
     this.model           = model;
     this.exchange        = exchange;
     this.logger          = logger;
     this.routingKey      = routingKey;
     this.deliveryTag     = deliveryTag;
     this.acknowledgment  = acknowledgment;
     this.replyProperties = replyProperties;
     #endregion
 }
Example #11
0
        public RmqOutboundRaR(Dictionary <string, string> configuration, IQueueLogger loggerObject)
        {
            try
            {
                #region Initialization
                base.Initialize(configuration, AmqpExchangeType.Direct, false, loggerObject);

                // Setting other fields.
                Address        = rabbitMqConfiguration.Address;
                exchangeName   = rabbitMqConfiguration.ExchangeName ?? string.Empty;
                routingKey     = rabbitMqConfiguration.RoutingKey ?? rabbitMqConfiguration.QueueName;
                replyQueueName = model.QueueDeclare().QueueName;
                correlationIds = new List <string>();

                // Registering event.
                var consumer = new EventingBasicConsumer(model);
                consumer.Received += ResponseReady;

                // Binding with queue.
                model.BasicConsume(replyQueueName, true, consumer);
                #endregion
            }
            catch (Exception ex) when(!(ex is QueueException))
            {
                #region Adding Context Data
                var context = new Dictionary <string, string>();

                if (!string.IsNullOrEmpty(rabbitMqConfiguration.ExchangeName))
                {
                    context.Add(CommonContextKeys.ExchangeName, rabbitMqConfiguration.ExchangeName);
                }

                if (!string.IsNullOrEmpty(rabbitMqConfiguration.RoutingKey))
                {
                    context.Add(CommonContextKeys.RoutingKey, rabbitMqConfiguration.RoutingKey);
                }
                #endregion

                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          errorCode: QueueErrorCode.FailedToInitializeMessageQueue,
                          message: ErrorMessages.FailedToInitializeMessageQueue,
                          innerException: ex,
                          queueContext: CommonItems.RabbitMqName,
                          queueName: rabbitMqConfiguration.QueueName,
                          address: rabbitMqConfiguration.Address,
                          context: context,
                          logger: logger);
            }
        }
        public RmqInboundFaF(Dictionary <string, string> configuration, IQueueLogger loggerObject)
        {
            try
            {
                #region Initialization
                base.Initialize(configuration, AmqpExchangeType.Direct, true, loggerObject);

                // Setting consumer object.
                consumer             = new EventingBasicConsumer(model);
                consumer.Received   += ReceiveReady;
                consumer.ConsumerTag = Guid.NewGuid().ToString("D");

                // Setting other fields.
                Address = rabbitMqConfiguration.Address;
                #endregion
            }
            catch (Exception ex) when(!(ex is QueueException))
            {
                #region Adding Context Data
                var context = new Dictionary <string, string>();

                if (!string.IsNullOrEmpty(rabbitMqConfiguration?.ExchangeName))
                {
                    context.Add(CommonContextKeys.ExchangeName, rabbitMqConfiguration?.ExchangeName);
                }

                if (!string.IsNullOrEmpty(rabbitMqConfiguration?.RoutingKey))
                {
                    context.Add(CommonContextKeys.RoutingKey, rabbitMqConfiguration?.RoutingKey);
                }
                #endregion

                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          errorCode: QueueErrorCode.FailedToInitializeMessageQueue,
                          message: ErrorMessages.FailedToInitializeMessageQueue,
                          innerException: ex,
                          queueContext: CommonItems.RabbitMqName,
                          queueName: rabbitMqConfiguration?.QueueName,
                          address: rabbitMqConfiguration?.Address,
                          context: context,
                          logger: logger);
            }
        }
Example #13
0
        public RmqOutboundFaF(Dictionary <string, string> configuration, IQueueLogger loggerObject)
        {
            try
            {
                #region Initialization
                base.Initialize(configuration, AmqpExchangeType.Direct, false, loggerObject);

                // Setting other fields.
                Address      = rabbitMqConfiguration.Address;
                exchangeName = rabbitMqConfiguration.ExchangeName ?? string.Empty;
                routingKey   = rabbitMqConfiguration.RoutingKey ?? rabbitMqConfiguration.QueueName;
                #endregion
            }
            catch (Exception ex) when(!(ex is QueueException))
            {
                #region Adding Context Data
                var context = new Dictionary <string, string>();

                if (!string.IsNullOrEmpty(rabbitMqConfiguration?.ExchangeName))
                {
                    context.Add(CommonContextKeys.ExchangeName, rabbitMqConfiguration?.ExchangeName);
                }

                if (!string.IsNullOrEmpty(rabbitMqConfiguration?.RoutingKey))
                {
                    context.Add(CommonContextKeys.RoutingKey, rabbitMqConfiguration?.RoutingKey);
                }
                #endregion

                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          errorCode: QueueErrorCode.FailedToInitializeMessageQueue,
                          message: ErrorMessages.FailedToInitializeMessageQueue,
                          innerException: ex,
                          queueContext: CommonItems.RabbitMqName,
                          queueName: rabbitMqConfiguration?.QueueName,
                          address: rabbitMqConfiguration?.Address,
                          context: context,
                          logger: logger);
            }
        }
Example #14
0
        public ZmqOutboundFaF(Dictionary <string, string> configuration, IQueueLogger loggerObject)
        {
            try
            {
                #region Initialization
                base.Initialize(configuration, ZeroMqSocketType.Push, false, loggerObject);

                // Setting fields.
                Address = zmqConfiguration.Address;
                #endregion
            }
            catch (Exception ex) when(!(ex is QueueException))
            {
                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          errorCode: QueueErrorCode.FailedToInitializeMessageQueue,
                          message: ErrorMessages.FailedToInitializeMessageQueue,
                          innerException: ex,
                          queueContext: CommonItems.ZeroMqName,
                          address: zmqConfiguration?.Address,
                          logger: logger);
            }
        }
Example #15
0
        public SbOutboundFaF(Dictionary <string, string> configuration, IQueueLogger loggerObject)
        {
            try
            {
                #region Initialization
                base.Initialize(configuration, false, loggerObject);

                // Setting other fields.
                Address = sbConfiguration.Address;
                #endregion
            }
            catch (Exception ex) when(!(ex is QueueException))
            {
                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          errorCode: QueueErrorCode.FailedToInitializeMessageQueue,
                          message: ErrorMessages.FailedToInitializeMessageQueue,
                          innerException: ex,
                          queueContext: CommonItems.ServiceBusName,
                          queueName: sbConfiguration.QueueName,
                          address: sbConfiguration.Address,
                          logger: logger);
            }
        }
        /// <summary>
        /// Helper method to prepare and log queue exception.
        /// NOTE: If logger is null, exception will not be logged.
        /// </summary>
        public static QueueException PrepareAndLogQueueException(QueueErrorCode errorCode, string message, Exception innerException, string queueContext, string queueName = "", string address = "", Dictionary <string, string> context = null, IQueueLogger logger = null)
        {
            #region Preparing Queue Exception
            var queueException = new QueueException(errorCode, message, context: new Dictionary <string, string>
            {
                [CommonContextKeys.QueueContext] = queueContext
            }, innerException: innerException);

            if (!string.IsNullOrWhiteSpace(address))
            {
                queueException.Data[CommonContextKeys.Address] = address;
            }

            if (!string.IsNullOrWhiteSpace(queueName))
            {
                queueException.Data[CommonContextKeys.QueueName] = queueName;
            }

            if (context != null)
            {
                foreach (var currentItem in context)
                {
                    queueException.Data[currentItem.Key] = currentItem.Value;
                }
            }
            #endregion

            #region Logging - Error
            logger?.Error(queueException, queueException.Message);
            #endregion

            #region Return
            return(queueException);

            #endregion
        }
Example #17
0
        /// <summary>
        /// Creates IInboundFaFMq implementation with the configuration provided by provider.
        /// </summary>
        /// <param name="configurationProvider">The configuration provider</param>
        /// <param name="logger">The queue logger</param>
        /// <param name="configurationIdentifier">The configuration identifier</param>
        public static IInboundFaFMq <TMessage> CreateInboundFaF <TMessage>(IQueueConfigurationProvider configurationProvider, string configurationIdentifier, IQueueLogger logger = null)
        {
            #region Initialization
            logger = logger ?? new NoLog();
            Dictionary <string, string> configuration = null;
            #endregion

            try
            {
                #region Configuration Retrieval
                configuration = RetrieveAndValidateConfiguration(configurationProvider, configurationIdentifier);
                #endregion

                #region Creating Implementation
                // Getting type details.
                var messageQueueTypeInfo = Type.GetType(configuration[CommonConfigurationKeys.Implementation], true, true);

                // Substituting generic parameters.
                var typeParams      = new[] { typeof(TMessage) };
                var genericTypeInfo = messageQueueTypeInfo.MakeGenericType(typeParams);

                // Creating instance.
                var messagingQueue = Activator.CreateInstance(genericTypeInfo, configuration, logger) as IInboundFaFMq <TMessage>;
                #endregion

                #region Return
                return(messagingQueue);

                #endregion
            }
            catch (QueueException queueException)
            {
                #region Logging - Error
                logger.Error(queueException, queueException.Message);
                #endregion

                throw;
            }
            catch (Exception ex)
            {
                var queueException = new QueueException(QueueErrorCode.FailedToInstantiateInboundFaFMq,
                                                        ErrorMessages.FailedToInstantiateInboundFaFMq, ex);

                queueException.Data["Implementation"] = configuration?[CommonConfigurationKeys.Implementation];

                #region Logging - Error
                logger.Error(queueException, queueException.Message);
                #endregion

                throw queueException;
            }
        }
Example #18
0
        /// <summary>
        /// Helper method to validate and collect ServiceBus parameters.
        /// </summary>
        internal static ServiceBusConfiguration CollectSbConfiguration(ref Dictionary <string, string> rawConfiguration, bool isInbound, ref IQueueLogger logger)
        {
            try
            {
                #region Parameters Validation
                var sbSettings = new ServiceBusConfiguration();
                rawConfiguration = rawConfiguration ?? new Dictionary <string, string>();

                var notSupportedParams =
                    rawConfiguration.Keys.Where(x => !CommonConfigurationKeys.GetAllKeys().Contains(x) &&
                                                !ServiceBusConfigurationKeys.GetAllKeys().Contains(x)).ToList();

                if (notSupportedParams.Any())
                {
                    throw new QueueException(QueueErrorCode.NotSupportedConfigurationParameters,
                                             ErrorMessages.NotSupportedConfigurationParameters, context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.NotSupportedParameters] = string.Join(",", notSupportedParams)
                    });
                }

                // Address
                if (!rawConfiguration.ContainsKey(CommonConfigurationKeys.Address) ||
                    string.IsNullOrWhiteSpace(rawConfiguration[CommonConfigurationKeys.Address]))
                {
                    throw new QueueException(QueueErrorCode.MissingRequiredConfigurationParameter,
                                             string.Format(ErrorMessages.MissingRequiredConfigurationParameter, CommonConfigurationKeys.Address),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = CommonConfigurationKeys.Address
                    });
                }

                sbSettings.Address = rawConfiguration[CommonConfigurationKeys.Address];

                // Namespace Address
                if (rawConfiguration.ContainsKey(ServiceBusConfigurationKeys.NamespaceAddress))
                {
                    if (string.IsNullOrWhiteSpace(rawConfiguration[ServiceBusConfigurationKeys.NamespaceAddress]))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               ServiceBusConfigurationKeys.NamespaceAddress),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.NamespaceAddress
                        });
                    }

                    sbSettings.NamespaceAddress = rawConfiguration[ServiceBusConfigurationKeys.NamespaceAddress];
                }

                // Queue Name
                if (!rawConfiguration.ContainsKey(CommonConfigurationKeys.QueueName) || string.IsNullOrWhiteSpace(rawConfiguration[CommonConfigurationKeys.QueueName]))
                {
                    throw new QueueException(QueueErrorCode.MissingRequiredConfigurationParameter,
                                             string.Format(ErrorMessages.MissingRequiredConfigurationParameter,
                                                           CommonConfigurationKeys.QueueName),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = CommonConfigurationKeys.QueueName
                    });
                }

                sbSettings.QueueName = rawConfiguration[CommonConfigurationKeys.QueueName];

                // MaxDeliveryCount
                short maxDeliveryCount;

                if (rawConfiguration.ContainsKey(ServiceBusConfigurationKeys.MaxDeliveryCount))
                {
                    if (!short.TryParse(rawConfiguration[ServiceBusConfigurationKeys.MaxDeliveryCount], out maxDeliveryCount))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               ServiceBusConfigurationKeys.MaxDeliveryCount),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.MaxDeliveryCount
                        });
                    }
                }
                else
                {
                    maxDeliveryCount = Defaults.MaxDeliveryCount;
                }

                sbSettings.MaxDeliveryCount = maxDeliveryCount;

                // MaxSizeInMegabytes
                long maxSizeInMegabytes;

                if (rawConfiguration.ContainsKey(ServiceBusConfigurationKeys.MaxSizeInMegabytes))
                {
                    if (!long.TryParse(rawConfiguration[ServiceBusConfigurationKeys.MaxSizeInMegabytes], out maxSizeInMegabytes))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               ServiceBusConfigurationKeys.MaxSizeInMegabytes),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.MaxSizeInMegabytes
                        });
                    }
                }
                else
                {
                    maxSizeInMegabytes = Defaults.MaxSizeInMegabytes;
                }

                sbSettings.MaxSizeInMegabytes = maxSizeInMegabytes;

                // EnableDeadLettering
                bool enableDeadLettering;

                if (rawConfiguration.ContainsKey(ServiceBusConfigurationKeys.EnableDeadLettering))
                {
                    if (!bool.TryParse(rawConfiguration[ServiceBusConfigurationKeys.EnableDeadLettering], out enableDeadLettering))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               ServiceBusConfigurationKeys.EnableDeadLettering),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.EnableDeadLettering
                        });
                    }
                }
                else
                {
                    enableDeadLettering = Defaults.EnableDeadLettering;
                }

                sbSettings.EnableDeadLettering = enableDeadLettering;

                // EnablePartitioning
                bool enablePartitioning;

                if (rawConfiguration.ContainsKey(ServiceBusConfigurationKeys.EnablePartitioning))
                {
                    if (!bool.TryParse(rawConfiguration[ServiceBusConfigurationKeys.EnablePartitioning], out enablePartitioning))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               ServiceBusConfigurationKeys.EnablePartitioning),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.EnablePartitioning
                        });
                    }
                }
                else
                {
                    enablePartitioning = Defaults.EnablePartitioning;
                }

                sbSettings.EnablePartitioning = enablePartitioning;

                // RequiresDuplicateDetection
                bool requiresDuplicateDetection;

                if (rawConfiguration.ContainsKey(ServiceBusConfigurationKeys.RequiresDuplicateDetection))
                {
                    if (!bool.TryParse(rawConfiguration[ServiceBusConfigurationKeys.RequiresDuplicateDetection], out requiresDuplicateDetection))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               ServiceBusConfigurationKeys.RequiresDuplicateDetection),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.RequiresDuplicateDetection
                        });
                    }
                }
                else
                {
                    requiresDuplicateDetection = Defaults.RequiresDuplicateDetection;
                }

                sbSettings.RequiresDuplicateDetection = requiresDuplicateDetection;

                // EnableBatchedOperations
                bool enableBatchedOperations;

                if (rawConfiguration.ContainsKey(ServiceBusConfigurationKeys.EnableBatchedOperations))
                {
                    if (!bool.TryParse(rawConfiguration[ServiceBusConfigurationKeys.EnableBatchedOperations], out enableBatchedOperations))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               ServiceBusConfigurationKeys.EnableBatchedOperations),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.EnableBatchedOperations
                        });
                    }
                }
                else
                {
                    enableBatchedOperations = Defaults.EnableBatchedOperations;
                }

                sbSettings.EnableBatchedOperations = enableBatchedOperations;

                // MessageTimeToLiveInMinutes
                if (rawConfiguration.ContainsKey(ServiceBusConfigurationKeys.MessageTimeToLiveInMinutes))
                {
                    int messageTimeToLiveInMinutes;

                    if (!int.TryParse(rawConfiguration[ServiceBusConfigurationKeys.MessageTimeToLiveInMinutes], out messageTimeToLiveInMinutes))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               ServiceBusConfigurationKeys.MessageTimeToLiveInMinutes),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.MessageTimeToLiveInMinutes
                        });
                    }

                    sbSettings.MessageTimeToLiveInMinutes = TimeSpan.FromMinutes(messageTimeToLiveInMinutes);
                }
                else
                {
                    sbSettings.MessageTimeToLiveInMinutes = Defaults.MessageTimeToLive;
                }

                // LockDurationInSeconds
                if (rawConfiguration.ContainsKey(ServiceBusConfigurationKeys.LockDurationInSeconds))
                {
                    int lockDurationInSeconds;

                    if (!int.TryParse(rawConfiguration[ServiceBusConfigurationKeys.LockDurationInSeconds], out lockDurationInSeconds))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               ServiceBusConfigurationKeys.LockDurationInSeconds),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.LockDurationInSeconds
                        });
                    }

                    sbSettings.LockDurationInSeconds = TimeSpan.FromSeconds(lockDurationInSeconds);
                }
                else
                {
                    sbSettings.LockDurationInSeconds = Defaults.LockDurationInSeconds;
                }

                // Acknowledgment
                bool acknowledgment;

                if (rawConfiguration.ContainsKey(ServiceBusConfigurationKeys.Acknowledgment))
                {
                    if (isInbound == false)
                    {
                        throw new QueueException(QueueErrorCode.ParameterNotApplicationInCurrentConfiguration,
                                                 string.Format(ErrorMessages.ParameterNotApplicationInCurrentConfiguration,
                                                               ServiceBusConfigurationKeys.Acknowledgment),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.Acknowledgment
                        });
                    }

                    if (!bool.TryParse(rawConfiguration[ServiceBusConfigurationKeys.Acknowledgment], out acknowledgment))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               ServiceBusConfigurationKeys.Acknowledgment),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.Acknowledgment
                        });
                    }
                }
                else
                {
                    acknowledgment = Defaults.Acknowledgment;
                }

                sbSettings.Acknowledgment = acknowledgment;

                // MaxConcurrentReceiveCallback
                ushort maxConcurrentReceiveCallback;

                if (rawConfiguration.ContainsKey(ServiceBusConfigurationKeys.MaxConcurrentReceiveCallback))
                {
                    if (isInbound == false)
                    {
                        throw new QueueException(QueueErrorCode.ParameterNotApplicationInCurrentConfiguration,
                                                 string.Format(ErrorMessages.ParameterNotApplicationInCurrentConfiguration,
                                                               ServiceBusConfigurationKeys.MaxConcurrentReceiveCallback),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.MaxConcurrentReceiveCallback
                        });
                    }

                    if (!ushort.TryParse(rawConfiguration[ServiceBusConfigurationKeys.MaxConcurrentReceiveCallback], out maxConcurrentReceiveCallback))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               ServiceBusConfigurationKeys.MaxConcurrentReceiveCallback),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = ServiceBusConfigurationKeys.MaxConcurrentReceiveCallback
                        });
                    }
                }
                else
                {
                    maxConcurrentReceiveCallback = Defaults.MaxConcurrentReceiveCallback;
                }

                sbSettings.MaxConcurrentReceiveCallback = maxConcurrentReceiveCallback;
                #endregion

                #region Return
                return(sbSettings);

                #endregion
            }
            catch (QueueException queueException)
            {
                #region Adding Context Data
                queueException.Data.Add(CommonContextKeys.QueueContext, ServiceBusName);
                #endregion

                #region Logging - Error
                logger.Error(queueException, queueException.Message);
                #endregion

                throw;
            }
            catch (Exception ex)
            {
                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          QueueErrorCode.GeneralConfigurationParsingError
                          , ErrorMessages.GeneralConfigurationParsingError, ex, ServiceBusName, logger: logger);
            }
        }
Example #19
0
        /// <summary>
        /// Common initialization code.
        /// </summary>
        protected virtual void Initialize(Dictionary <string, string> configuration, AmqpExchangeType exchangeType, bool isInbound, IQueueLogger loggerObject = null)
        {
            try
            {
                #region Logger Initialization
                logger = loggerObject;
                #endregion

                #region Parameters Collection
                rabbitMqConfiguration = CommonItems.CollectConfiguration(ref configuration, isInbound, ref logger);
                #endregion

                #region Initializing Connection
                var connectionFactory = GetRmqConnectionFactory();
                connection = connectionFactory.CreateConnection();
                #endregion

                #region Initializing Queue
                model = connection.CreateModel();

                if (!IsQueueExistsHelper())
                {
                    throw MessageQueueCommonItems.PrepareAndLogQueueException(
                              errorCode: QueueErrorCode.QueueDoesNotExist,
                              message: ErrorMessages.QueueDoesNotExist,
                              innerException: null,
                              queueContext: CommonItems.RabbitMqName,
                              queueName: rabbitMqConfiguration.QueueName,
                              address: rabbitMqConfiguration.Address,
                              logger: logger);
                }

                if (!IsExchangeExistsHelper())
                {
                    throw MessageQueueCommonItems.PrepareAndLogQueueException(
                              errorCode: QueueErrorCode.ExchangeDoesNotExist,
                              message: ErrorMessages.ExchangeDoesNotExist,
                              innerException: null,
                              queueContext: CommonItems.RabbitMqName,
                              address: rabbitMqConfiguration.Address,
                              context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ExchangeName] = rabbitMqConfiguration.ExchangeName
                    },
                              logger: logger);
                }

                // Binding queue with exchange if configured.
                if (!string.IsNullOrWhiteSpace(rabbitMqConfiguration.ExchangeName))
                {
                    model.QueueBind(rabbitMqConfiguration.QueueName, rabbitMqConfiguration.ExchangeName, rabbitMqConfiguration.RoutingKey ?? string.Empty);
                }

                if (isInbound)
                {
                    model.BasicQos(0, rabbitMqConfiguration.MaxConcurrentReceiveCallback, false);
                }

                //  Setting model properties.
                modelProperties            = model.CreateBasicProperties();
                modelProperties.Persistent = rabbitMqConfiguration.DurableMessage;
                #endregion

                #region Registering Events
                model.BasicReturn             += OnBasicReturn;
                model.ModelShutdown           += OnModelShutdown;
                connection.ConnectionShutdown += OnConnectionShutdown;
                #endregion

                #region Updating Flag
                isInitialized = true;
                #endregion

                #region Cleaning up Sensitive Info
                rabbitMqConfiguration.Password = null;
                #endregion
            }
            catch (Exception ex) when(!(ex is QueueException))
            {
                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          errorCode: QueueErrorCode.FailedToInitializeMessageQueue,
                          message: ErrorMessages.FailedToInitializeMessageQueue,
                          innerException: ex,
                          queueContext: CommonItems.RabbitMqName,
                          queueName: rabbitMqConfiguration.QueueName,
                          address: rabbitMqConfiguration.Address,
                          logger: logger);
            }
        }
Example #20
0
        /// <summary>
        /// Helper method to validate and collect ZeroMq parameters.
        /// </summary>
        public static ZeroMqConfiguration CollectZmqConfiguration(ref Dictionary <string, string> rawConfiguration, bool isInbound, ref IQueueLogger logger)
        {
            try
            {
                #region Parameters Validation
                var zeroMqSettings = new ZeroMqConfiguration();
                rawConfiguration = rawConfiguration ?? new Dictionary <string, string>();

                var notSupportedParams =
                    rawConfiguration.Keys.Where(x => !CommonConfigurationKeys.GetAllKeys().Contains(x) &&
                                                !ZeroMqConfigurationKeys.GetAllKeys().Contains(x)).ToList();

                if (notSupportedParams.Any())
                {
                    throw new QueueException(QueueErrorCode.NotSupportedConfigurationParameters,
                                             ErrorMessages.NotSupportedConfigurationParameters, context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.NotSupportedParameters] = string.Join(",", notSupportedParams)
                    });
                }

                // Address
                if (!rawConfiguration.ContainsKey(CommonConfigurationKeys.Address) ||
                    string.IsNullOrWhiteSpace(rawConfiguration[CommonConfigurationKeys.Address]))
                {
                    throw new QueueException(QueueErrorCode.MissingRequiredConfigurationParameter,
                                             string.Format(ErrorMessages.MissingRequiredConfigurationParameter,
                                                           CommonConfigurationKeys.Address),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = CommonConfigurationKeys.Address
                    });
                }

                zeroMqSettings.Address = rawConfiguration[CommonConfigurationKeys.Address];
                #endregion

                #region Return
                return(zeroMqSettings);

                #endregion
            }
            catch (QueueException queueException)
            {
                #region Adding Context Data
                queueException.Data.Add(CommonContextKeys.QueueContext, ZeroMqName);
                #endregion

                #region Logging - Error
                logger.Error(queueException, queueException.Message);
                #endregion

                throw;
            }
            catch (Exception ex)
            {
                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          QueueErrorCode.GeneralConfigurationParsingError
                          , ErrorMessages.GeneralConfigurationParsingError, ex, ZeroMqName, logger: logger);
            }
        }
Example #21
0
        /// <summary>
        /// Helper method to validate and collect RabbitMq parameters.
        /// </summary>
        public static RabbitMqConfiguration CollectConfiguration(ref Dictionary <string, string> rawConfiguration, bool isInbound, ref IQueueLogger logger)
        {
            try
            {
                #region Initialization
                var rabbitMqConfiguration = new RabbitMqConfiguration();
                rawConfiguration = rawConfiguration ?? new Dictionary <string, string>();
                #endregion

                #region Collecting Common Configuration
                MessageQueueCommonItems.CollectCommonConfiguration(ref rawConfiguration, rabbitMqConfiguration, RabbitMqConfigurationKeys.GetAllKeys());
                #endregion

                #region Collecting Other Configuration
                // Port
                int port = 0;

                if (rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.Port) &&
                    !int.TryParse(rawConfiguration[RabbitMqConfigurationKeys.Port], out port))
                {
                    throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                             string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                           RabbitMqConfigurationKeys.Port),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.Port
                    });
                }

                rabbitMqConfiguration.Port = port;

                // UserName
                if (!rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.UserName) ||
                    string.IsNullOrWhiteSpace(rawConfiguration[RabbitMqConfigurationKeys.UserName]))
                {
                    throw new QueueException(QueueErrorCode.MissingRequiredConfigurationParameter,
                                             string.Format(ErrorMessages.MissingRequiredConfigurationParameter,
                                                           RabbitMqConfigurationKeys.UserName),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.UserName
                    });
                }

                rabbitMqConfiguration.UserName = rawConfiguration[RabbitMqConfigurationKeys.UserName];

                // Password
                if (!rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.Password) ||
                    string.IsNullOrWhiteSpace(rawConfiguration[RabbitMqConfigurationKeys.Password]))
                {
                    throw new QueueException(QueueErrorCode.MissingRequiredConfigurationParameter,
                                             string.Format(ErrorMessages.MissingRequiredConfigurationParameter,
                                                           RabbitMqConfigurationKeys.Password),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.Password
                    });
                }

                rabbitMqConfiguration.Password = rawConfiguration[RabbitMqConfigurationKeys.Password];

                // Queue Name
                if (!rawConfiguration.ContainsKey(CommonConfigurationKeys.QueueName) ||
                    string.IsNullOrWhiteSpace(rawConfiguration[CommonConfigurationKeys.QueueName]))
                {
                    throw new QueueException(QueueErrorCode.MissingRequiredConfigurationParameter,
                                             string.Format(ErrorMessages.MissingRequiredConfigurationParameter,
                                                           CommonConfigurationKeys.QueueName),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = CommonConfigurationKeys.QueueName
                    });
                }

                rabbitMqConfiguration.QueueName = rawConfiguration[CommonConfigurationKeys.QueueName];

                // Exchange Name
                rabbitMqConfiguration.ExchangeName = null;

                if (rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.ExchangeName))
                {
                    if (string.IsNullOrWhiteSpace(rawConfiguration[RabbitMqConfigurationKeys.ExchangeName]))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               RabbitMqConfigurationKeys.ExchangeName),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.ExchangeName
                        });
                    }

                    rabbitMqConfiguration.ExchangeName = rawConfiguration[RabbitMqConfigurationKeys.ExchangeName];
                }

                // Routing Key
                rabbitMqConfiguration.RoutingKey = null;

                if (rabbitMqConfiguration.ExchangeName == null &&
                    rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.RoutingKey))
                {
                    throw new QueueException(QueueErrorCode.ParameterNotApplicationInCurrentConfiguration,
                                             string.Format(ErrorMessages.ParameterNotApplicationInCurrentConfiguration,
                                                           RabbitMqConfigurationKeys.RoutingKey),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.RoutingKey
                    });
                }

                if (rabbitMqConfiguration.ExchangeName != null)
                {
                    if (!rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.RoutingKey))
                    {
                        throw new QueueException(QueueErrorCode.ParameterRequiredInCurrentConfiguration,
                                                 string.Format(ErrorMessages.ParameterRequiredInCurrentConfiguration,
                                                               RabbitMqConfigurationKeys.RoutingKey),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.RoutingKey
                        });
                    }

                    rabbitMqConfiguration.RoutingKey = rawConfiguration[RabbitMqConfigurationKeys.RoutingKey];
                }

                // Durable Exchange
                var durableExchange = false;

                if (rabbitMqConfiguration.ExchangeName == null &&
                    rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.DurableExchange))
                {
                    throw new QueueException(QueueErrorCode.ParameterNotApplicationInCurrentConfiguration,
                                             string.Format(ErrorMessages.ParameterNotApplicationInCurrentConfiguration,
                                                           RabbitMqConfigurationKeys.DurableExchange),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.DurableExchange
                    });
                }

                if (rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.DurableExchange) &&
                    !bool.TryParse(rawConfiguration[RabbitMqConfigurationKeys.DurableExchange], out durableExchange))
                {
                    throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                             string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                           RabbitMqConfigurationKeys.DurableExchange),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.DurableExchange
                    });
                }

                rabbitMqConfiguration.DurableExchange = durableExchange;

                // Durable Queue
                var durableQueue = false;

                if (rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.DurableQueue) &&
                    !bool.TryParse(rawConfiguration[RabbitMqConfigurationKeys.DurableQueue], out durableQueue))
                {
                    throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                             string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                           RabbitMqConfigurationKeys.DurableQueue),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.DurableQueue
                    });
                }

                rabbitMqConfiguration.DurableQueue = durableQueue;

                // Durable Message
                var durableMessage = false;

                if (rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.DurableMessage) &&
                    !bool.TryParse(rawConfiguration[RabbitMqConfigurationKeys.DurableMessage], out durableMessage))
                {
                    throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                             string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                           RabbitMqConfigurationKeys.DurableMessage),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.DurableMessage
                    });
                }

                rabbitMqConfiguration.DurableMessage = durableMessage;

                // Acknowledgment
                var acknowledgment = false;

                if (isInbound == false && rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.Acknowledgment))
                {
                    throw new QueueException(QueueErrorCode.ParameterNotApplicationInCurrentConfiguration,
                                             string.Format(ErrorMessages.ParameterNotApplicationInCurrentConfiguration,
                                                           RabbitMqConfigurationKeys.Acknowledgment),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.Acknowledgment
                    });
                }

                if (rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.Acknowledgment) &&
                    !bool.TryParse(rawConfiguration[RabbitMqConfigurationKeys.Acknowledgment], out acknowledgment))
                {
                    throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                             string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                           RabbitMqConfigurationKeys.Acknowledgment),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.Acknowledgment
                    });
                }

                rabbitMqConfiguration.Acknowledgment = acknowledgment;

                // MaxConcurrentReceiveCallback
                ushort maxConcurrentReceiveCallback;

                if (rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.MaxConcurrentReceiveCallback))
                {
                    if (isInbound == false)
                    {
                        throw new QueueException(QueueErrorCode.ParameterNotApplicationInCurrentConfiguration,
                                                 string.Format(ErrorMessages.ParameterNotApplicationInCurrentConfiguration,
                                                               RabbitMqConfigurationKeys.MaxConcurrentReceiveCallback),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.MaxConcurrentReceiveCallback
                        });
                    }

                    if (!ushort.TryParse(rawConfiguration[RabbitMqConfigurationKeys.MaxConcurrentReceiveCallback],
                                         out maxConcurrentReceiveCallback))
                    {
                        throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                                 string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                               RabbitMqConfigurationKeys.MaxConcurrentReceiveCallback),
                                                 context: new Dictionary <string, string>
                        {
                            [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.MaxConcurrentReceiveCallback
                        });
                    }
                }
                else
                {
                    maxConcurrentReceiveCallback = Defaults.MaxConcurrentReceiveCallback;
                }

                rabbitMqConfiguration.MaxConcurrentReceiveCallback = maxConcurrentReceiveCallback;

                // Connection Timeout
                var connectionTimeout = Defaults.RabbitMqConnectionTimeoutInMinutes;

                if (rawConfiguration.ContainsKey(RabbitMqConfigurationKeys.ConnectionTimeoutInMinutes) &&
                    !int.TryParse(rawConfiguration[RabbitMqConfigurationKeys.ConnectionTimeoutInMinutes],
                                  out connectionTimeout))
                {
                    throw new QueueException(QueueErrorCode.InvalidValueForConfigurationParameter,
                                             string.Format(ErrorMessages.InvalidValueForConfigurationParameter,
                                                           RabbitMqConfigurationKeys.ConnectionTimeoutInMinutes),
                                             context: new Dictionary <string, string>
                    {
                        [CommonContextKeys.ParameterName] = RabbitMqConfigurationKeys.ConnectionTimeoutInMinutes
                    });
                }

                rabbitMqConfiguration.ConnectionTimeoutInMinutes = connectionTimeout;
                #endregion

                #region Return
                return(rabbitMqConfiguration);

                #endregion
            }
            catch (QueueException queueException)
            {
                #region Adding Context Data
                queueException.Data.Add(CommonContextKeys.QueueContext, RabbitMqName);
                #endregion

                #region Logging - Error
                logger.Error(queueException, queueException.Message);
                #endregion

                throw;
            }
            catch (Exception ex)
            {
                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          QueueErrorCode.GeneralConfigurationParsingError
                          , ErrorMessages.GeneralConfigurationParsingError, ex, RabbitMqName, logger: logger);
            }
        }
        /// <summary>
        /// Helper method to validate and collect ZeroMq parameters.
        /// </summary>
        public static ZeroMqConfiguration CollectZmqConfiguration(ref Dictionary <string, string> rawConfiguration, bool isInbound, ref IQueueLogger logger)
        {
            try
            {
                #region Initialization
                var zeroMqConfiguration = new ZeroMqConfiguration();
                rawConfiguration = rawConfiguration ?? new Dictionary <string, string>();
                #endregion

                #region Collecting Common Configuration
                MessageQueueCommonItems.CollectCommonConfiguration(ref rawConfiguration, zeroMqConfiguration, ZeroMqConfigurationKeys.GetAllKeys());
                #endregion

                #region Collecting Other Configuration
                // Nothing to collect.
                #endregion

                #region Return
                return(zeroMqConfiguration);

                #endregion
            }
            catch (QueueException queueException)
            {
                #region Adding Context Data
                queueException.Data.Add(CommonContextKeys.QueueContext, ZeroMqName);
                #endregion

                #region Logging - Error
                logger.Error(queueException, queueException.Message);
                #endregion

                throw;
            }
            catch (Exception ex)
            {
                throw MessageQueueCommonItems.PrepareAndLogQueueException(
                          QueueErrorCode.GeneralConfigurationParsingError
                          , ErrorMessages.GeneralConfigurationParsingError, ex, ZeroMqName, logger: logger);
            }
        }