Exemple #1
0
        public IntegrationFixture_Zero()
        {
            Seasoning = new RabbitSeasoning
            {
                ThrottleFastBodyLoops = false,
                ThrowExceptions       = false
            };

            Seasoning.SerializeSettings.SerializationMethod = SerializationMethod.ZeroFormat;
            Seasoning.FactorySettings.RabbitHostName        = "localhost";
            Seasoning.PoolSettings.EnableAutoScaling        = true;
            Seasoning.PoolSettings.ConnectionName           = "RabbitServiceTest";
            Seasoning.PoolSettings.ConnectionPoolCount      = 1;
            Seasoning.PoolSettings.ChannelPoolCount         = 2;

            var channelPool = new RabbitChannelPool();

            channelPool
            .SetConnectionPoolAsync(Seasoning, new RabbitConnectionPool())
            .GetAwaiter().GetResult();

            RabbitDeliveryService  = new RabbitDeliveryService(Seasoning, channelPool);
            RabbitTopologyService  = new RabbitTopologyService(Seasoning, channelPool);
            RabbitSerializeService = new RabbitSerializeService(Seasoning, channelPool);

            try
            {
                RabbitTopologyService.QueueDeleteAsync(TestQueueName1, false, false).GetAwaiter().GetResult();
                RabbitTopologyService.QueueDeleteAsync(TestQueueName2, false, false).GetAwaiter().GetResult();
                RabbitTopologyService.QueueDeleteAsync(TestQueueName3, false, false).GetAwaiter().GetResult();
                RabbitTopologyService.QueueDeleteAsync(TestQueueName4, false, false).GetAwaiter().GetResult();
                RabbitTopologyService.ExchangeDeleteAsync(TestExchangeName, false).GetAwaiter().GetResult();
            }
            catch { }
        }
        public BenchmarkFixture()
        {
            QueueName    = "CookedRabbit.Benchmark.Scaling";
            ExchangeName = string.Empty;

            // Configured for performance.
            var seasoning = new RabbitSeasoning
            {
                ThrottleFastBodyLoops = false,
                ThrowExceptions       = false,
                WriteErrorsToConsole  = false,
                WriteErrorsToILogger  = false,
                BatchBreakOnException = true
            };

            seasoning.PoolSettings.EnableAutoScaling         = true;
            seasoning.PoolSettings.EmptyPoolWaitTime         = 10;
            seasoning.PoolSettings.WriteSleepNoticeToConsole = false;
            seasoning.PoolSettings.ConnectionPoolCount       = 4;
            seasoning.PoolSettings.ChannelPoolCount          = 4;

            var channelPool = new RabbitChannelPool();

            channelPool.Initialize(seasoning).GetAwaiter().GetResult();

            DeliveryService    = new RabbitDeliveryService(seasoning, channelPool);
            TopologyService    = new RabbitTopologyService(seasoning, channelPool);
            MaintenanceService = new RabbitMaintenanceService(seasoning, channelPool);

            TopologyService.QueueDeclareAsync(QueueName).GetAwaiter().GetResult();
            Payloads = CreatePayloadsAsync(MessagesToSend, MessageSize).GetAwaiter().GetResult();
        }
Exemple #3
0
        /// <summary>
        /// CookedRabbit RabbitChannelPool factory.
        /// </summary>
        /// <param name="rabbitSeasoning"></param>
        /// <returns><see cref="IRabbitChannelPool"/></returns>
        public static async Task <IRabbitChannelPool> CreateRabbitChannelPoolAsync(RabbitSeasoning rabbitSeasoning)
        {
            RabbitChannelPool rcp = new RabbitChannelPool();
            await rcp.Initialize(rabbitSeasoning);

            return(rcp);
        }
        /// <summary>
        /// Unbind an Exchange from another Exchange asynchronously.
        /// <para>Returns success or failure.</para>
        /// </summary>
        /// <param name="childExchangeName"></param>
        /// <param name="parentExchangeName"></param>
        /// <param name="routingKey"></param>
        /// <param name="args"></param>
        /// <returns>A bool indicating success or failure.</returns>
        public async Task <bool> ExchangeUnbindFromExchangeAsync(string childExchangeName, string parentExchangeName, string routingKey = "",
                                                                 IDictionary <string, object> args = null)
        {
            Guard.AgainstNullOrEmpty(parentExchangeName, nameof(parentExchangeName));
            Guard.AgainstNullOrEmpty(childExchangeName, nameof(childExchangeName));

            var success     = false;
            var channelPair = await RabbitChannelPool.GetPooledChannelPairAsync().ConfigureAwait(false);

            try
            {
                channelPair.Channel.ExchangeUnbind(destination: childExchangeName,
                                                   source: parentExchangeName,
                                                   routingKey: routingKey,
                                                   arguments: args);

                success = true;
            }
            catch (Exception e)
            {
                await HandleErrorAsync(e, channelPair.ChannelId, new { channelPair.ChannelId }).ConfigureAwait(false);

                if (_seasoning.ThrowExceptions)
                {
                    throw;
                }
            }
            finally { RabbitChannelPool.ReturnChannelToPool(channelPair); }

            return(success);
        }
        /// <summary>
        /// Create an Exchange asynchronously.
        /// <para>Returns success or failure.</para>
        /// </summary>
        /// <param name="exchangeName"></param>
        /// <param name="exchangeType"></param>
        /// <param name="durable"></param>
        /// <param name="autoDelete"></param>
        /// <param name="args"></param>
        /// <returns>A bool indicating success or failure.</returns>
        public async Task <bool> ExchangeDeclareAsync(string exchangeName, string exchangeType, bool durable = true,
                                                      bool autoDelete = false, IDictionary <string, object> args = null)
        {
            Guard.AgainstNullOrEmpty(exchangeName, nameof(exchangeName));

            var success     = false;
            var channelPair = await RabbitChannelPool.GetPooledChannelPairAsync().ConfigureAwait(false);

            try
            {
                channelPair.Channel.ExchangeDeclare(exchange: exchangeName,
                                                    type: exchangeType,
                                                    durable: durable,
                                                    autoDelete: autoDelete,
                                                    arguments: args);

                success = true;
            }
            catch (Exception e)
            {
                await HandleErrorAsync(e, channelPair.ChannelId, new { channelPair.ChannelId }).ConfigureAwait(false);

                if (_seasoning.ThrowExceptions)
                {
                    throw;
                }
            }
            finally { RabbitChannelPool.ReturnChannelToPool(channelPair); }

            return(success);
        }
        /// <summary>
        /// Delete an Exchange asynchronously.
        /// <para>Returns success or failure.</para>
        /// </summary>
        /// <param name="exchangeName"></param>
        /// <param name="onlyIfUnused"></param>
        /// <returns>A bool indicating success or failure.</returns>
        public async Task <bool> ExchangeDeleteAsync(string exchangeName, bool onlyIfUnused = false)
        {
            Guard.AgainstNullOrEmpty(exchangeName, nameof(exchangeName));

            var success     = false;
            var channelPair = await RabbitChannelPool.GetPooledChannelPairAsync().ConfigureAwait(false);

            try
            {
                channelPair.Channel.ExchangeDelete(exchange: exchangeName,
                                                   ifUnused: onlyIfUnused);

                success = true;
            }
            catch (Exception e)
            {
                await HandleErrorAsync(e, channelPair.ChannelId, new { channelPair.ChannelId }).ConfigureAwait(false);

                if (_seasoning.ThrowExceptions)
                {
                    throw;
                }
            }
            finally { RabbitChannelPool.ReturnChannelToPool(channelPair); }

            return(success);
        }
Exemple #7
0
        /// <summary>
        /// CookedRabbit RabbitChannelPool factory.
        /// </summary>
        /// <param name="rabbitSeasoning"></param>
        /// <returns><see cref="IRabbitChannelPool"/></returns>
        public static async Task <IRabbitChannelPool> CreateRabbitChannelPoolAsync(RabbitSeasoning rabbitSeasoning)
        {
            var rcp = new RabbitChannelPool();
            await rcp.Initialize(rabbitSeasoning).ConfigureAwait(false);

            return(rcp);
        }
        /// <summary>
        /// Bind a queue to exchange asynchronously.
        /// <para>Returns success or failure.</para>
        /// </summary>
        /// <param name="queueName"></param>
        /// <param name="exchangeName"></param>
        /// <param name="routingKey"></param>
        /// <param name="args"></param>
        /// <returns>A bool indicating success or failure.</returns>
        public async Task <bool> QueueBindToExchangeAsync(string queueName, string exchangeName, string routingKey = "",
                                                          IDictionary <string, object> args = null)
        {
            Guard.AgainstNullOrEmpty(exchangeName, nameof(exchangeName));
            Guard.AgainstNullOrEmpty(queueName, nameof(queueName));

            var success     = false;
            var channelPair = await RabbitChannelPool.GetPooledChannelPairAsync().ConfigureAwait(false);

            try
            {
                channelPair.Channel.QueueBind(queue: queueName,
                                              exchange: exchangeName,
                                              routingKey: routingKey,
                                              arguments: args);

                success = true;
            }
            catch (Exception e)
            {
                await HandleErrorAsync(e, channelPair.ChannelId, new { channelPair.ChannelId }).ConfigureAwait(false);

                if (_seasoning.ThrowExceptions)
                {
                    throw;
                }
            }
            finally { RabbitChannelPool.ReturnChannelToPool(channelPair); }

            return(success);
        }
Exemple #9
0
        private async Task Setup(int messagesToSend, int messageSizes)
        {
            QueueName    = "CookedRabbit.Benchmark.Scaling";
            ExchangeName = string.Empty;

            // Configured for performance.
            var seasoning = new RabbitSeasoning
            {
                ThrottleFastBodyLoops = false,
                ThrowExceptions       = false,
                WriteErrorsToConsole  = false,
                WriteErrorsToILogger  = false,
                BatchBreakOnException = true
            };

            seasoning.PoolSettings.EnableAutoScaling         = true;
            seasoning.PoolSettings.EmptyPoolWaitTime         = 10;
            seasoning.PoolSettings.WriteSleepNoticeToConsole = false;
            seasoning.PoolSettings.ConnectionPoolCount       = 4;
            seasoning.PoolSettings.ChannelPoolCount          = 16;

            var channelPool = new RabbitChannelPool();
            await channelPool.Initialize(seasoning);

            _deliveryService    = new RabbitDeliveryService(seasoning, channelPool);
            _topologyService    = new RabbitTopologyService(seasoning, channelPool);
            _maintenanceService = new RabbitMaintenanceService(seasoning, channelPool);

            await _topologyService.QueueDeclareAsync(QueueName);

            Payloads = await CreatePayloadsAsync(messagesToSend, messageSizes);

            FirstRun = false;
        }
Exemple #10
0
        /// <summary>
        /// Transfers a number of messages from one queue to another queue.
        /// </summary>
        /// <param name="originQueueName">The queue to remove from.</param>
        /// <param name="targetQueueName">The destination queue.</param>
        /// <param name="count">Number of messages to transfer</param>
        /// <returns>A bool indicating success or failure.</returns>
        public async Task <bool> TransferMessagesAsync(string originQueueName, string targetQueueName, ushort count)
        {
            Guard.AgainstNullOrEmpty(originQueueName, nameof(originQueueName));
            Guard.AgainstNullOrEmpty(targetQueueName, nameof(targetQueueName));

            var success     = false;
            var channelPair = await RabbitChannelPool.GetPooledChannelPairAsync().ConfigureAwait(false);

            try
            {
                for (ushort i = 0; i < count; i++)
                {
                    var result = channelPair.Channel.BasicGet(originQueueName, true);

                    if (result?.Body != null)
                    {
                        channelPair.Channel.BasicPublish(string.Empty, targetQueueName, false, null, result.Body);
                    }
                }

                success = true;
            }
            catch (Exception e)
            {
                await HandleErrorAsync(e, channelPair.ChannelId, new { channelPair.ChannelId }).ConfigureAwait(false);

                if (_seasoning.ThrowExceptions)
                {
                    throw;
                }
            }
            finally { RabbitChannelPool.ReturnChannelToPool(channelPair); }

            return(success);
        }
Exemple #11
0
        /// <summary>
        /// Empty/purge the queue.
        /// </summary>
        /// <param name="queueName">The queue to remove from.</param>
        /// <param name="deleteQueueAfter">Indicate if you want to delete the queue after purge.</param>
        /// <returns>A bool indicating success or failure.</returns>
        public async Task <bool> PurgeQueueAsync(string queueName, bool deleteQueueAfter = false)
        {
            Guard.AgainstNullOrEmpty(queueName, nameof(queueName));

            var success     = false;
            var channelPair = await RabbitChannelPool.GetPooledChannelPairAsync().ConfigureAwait(false);

            try
            {
                channelPair.Channel.QueuePurge(queueName);

                if (deleteQueueAfter)
                {
                    channelPair.Channel.QueueDelete(queueName, false, false);
                }

                success = true;
            }
            catch (Exception e)
            {
                await HandleErrorAsync(e, channelPair.ChannelId, new { channelPair.ChannelId }).ConfigureAwait(false);

                if (_seasoning.ThrowExceptions)
                {
                    throw;
                }
            }
            finally { RabbitChannelPool.ReturnChannelToPool(channelPair); }

            return(success);
        }
 /// <summary>
 /// RabbitTopologyService dispose method.
 /// </summary>
 /// <param name="disposing"></param>
 protected virtual void Dispose(bool disposing)
 {
     if (!_disposedValue)
     {
         if (disposing)
         {
             RabbitChannelPool.Shutdown();
         }
         _disposedValue = true;
     }
 }
Exemple #13
0
        /// <summary>
        /// RabbitService dispose method.
        /// </summary>
        /// <param name="disposing"></param>
        protected override void Dispose(bool disposing)
        {
            if (!_disposedValue)
            {
                if (disposing)
                {
                    _stopPingPong = true;
                    _cancellationTokenSource.Cancel();
                    _cancellationTokenSource.Dispose();
                    RabbitChannelPool.Shutdown();
                }

                _disposedValue = true;
            }
        }
        private async Task <bool> PublishTestMessageAsync(string queueName)
        {
            var success     = false;
            var channelPair = await RabbitChannelPool.GetPooledChannelPairAsync().ConfigureAwait(false);

            try
            {
                channelPair.Channel.BasicPublish(exchange: string.Empty,
                                                 routingKey: queueName,
                                                 body: _testPayload);

                success = true;
            }
            catch (Exception e)
            {
                await HandleErrorAsync(e, channelPair.ChannelId, new { channelPair.ChannelId }).ConfigureAwait(false);
            }
            finally { RabbitChannelPool.ReturnChannelToPool(channelPair); }

            return(success);
        }
Exemple #15
0
        private async Task <byte[]> GetTestMessageAsync(string queueName)
        {
            byte[] body        = null;
            var    channelPair = await RabbitChannelPool.GetPooledChannelPairAsync().ConfigureAwait(false);

            try
            {
                var result = channelPair.Channel.BasicGet(queueName, true);

                if (result?.Body != null)
                {
                    body = result.Body;
                }
            }
            catch (Exception e)
            {
                await HandleErrorAsync(e, channelPair.ChannelId, new { channelPair.ChannelId }).ConfigureAwait(false);
            }
            finally { RabbitChannelPool.ReturnChannelToPool(channelPair); }

            return(body);
        }
        public void Setup()
        {
            // Configured for performance.
            var seasoning = new RabbitSeasoning
            {
                ThrottleFastBodyLoops = false,
                ThrowExceptions       = false,
                WriteErrorsToConsole  = false,
                WriteErrorsToILogger  = false,
            };

            seasoning.PoolSettings.EnableAutoScaling         = true;
            seasoning.PoolSettings.EmptyPoolWaitTime         = 10;
            seasoning.PoolSettings.WriteSleepNoticeToConsole = false;
            seasoning.PoolSettings.ConnectionPoolCount       = 4;
            seasoning.PoolSettings.ChannelPoolCount          = 16;

            var channelPool = new RabbitChannelPool();

            channelPool.Initialize(seasoning).GetAwaiter().GetResult();

            _deliveryService = new RabbitDeliveryService(seasoning, channelPool);
            _topologyService = new RabbitTopologyService(seasoning, channelPool);
        }