Exemple #1
0
        private static void RunShovel(ShovelOptions options)
        {
            int messageCount;

            using (var sourceConnection = GetConnection(options))
                using (var sourceChannel = sourceConnection.CreateModel())
                {
                    var shovelCommand = new ShovelCommand
                    {
                        QueueName       = options.QueueName,
                        TargetQueueName = !string.IsNullOrEmpty(options.TargetQueueName) ? options.TargetQueueName : options.QueueName,
                        RemoveMessages  = options.RemoveMessages,
                        MaxCount        = options.MaxCount
                    };


                    if (RequiresSecondConnection(options))
                    {
                        using (var targetConnection = GetTargetConnection(options))
                            using (var targetChannel = targetConnection.CreateModel())
                            {
                                messageCount = shovelCommand.Execute(sourceChannel, targetChannel, GetRateLimiter(options.MaxRate));
                            }
                    }
                    else
                    {
                        messageCount = shovelCommand.Execute(sourceChannel, sourceChannel, GetRateLimiter(options.MaxRate));
                    }
                }

            Console.WriteLine($"{messageCount} message{(messageCount != 1 ? "s" : "")} shoveled.");
        }
Exemple #2
0
        private static IConnection GetTargetConnection(ShovelOptions options)
        {
            var factory = new ConnectionFactory
            {
                HostName    = !string.IsNullOrEmpty(options.TargetHost) ? options.TargetHost : options.Host,
                Port        = options.TargetPort ?? options.Port,
                VirtualHost = !string.IsNullOrEmpty(options.TargetVirtualHost) ? options.TargetVirtualHost : options.VirtualHost,
                UserName    = !string.IsNullOrEmpty(options.TargetUsername) ? options.TargetUsername : options.Username,
                Password    = !string.IsNullOrEmpty(options.TargetPassword) ? options.TargetPassword : options.Password
            };

            return(factory.CreateConnection());
        }
Exemple #3
0
        private static bool RequiresSecondConnection(ShovelOptions options)
        {
            if (!string.IsNullOrEmpty(options.TargetHost) && options.TargetHost != options.Host)
            {
                return(true);
            }

            if (options.TargetPort.HasValue && options.TargetPort.Value != options.Port)
            {
                return(true);
            }

            if (!string.IsNullOrEmpty(options.TargetVirtualHost) && options.TargetVirtualHost != options.VirtualHost)
            {
                return(true);
            }


            // All relevant target host parameters are either omitted or the same. This means the queue must be different
            // to prevent an infinite loop.
            if (string.IsNullOrEmpty(options.TargetQueueName) || options.TargetQueueName == options.QueueName)
            {
                throw new ArgumentException("Target queue must be different from the source queue when shoveling within the same (virtual) host");
            }


            if (!string.IsNullOrEmpty(options.TargetUsername) && options.TargetUsername != options.Username)
            {
                return(true);
            }

            // ReSharper disable once ConvertIfStatementToReturnStatement
            if (!string.IsNullOrEmpty(options.TargetPassword) && options.TargetPassword != options.Password)
            {
                return(true);
            }


            // Everything's the same, we can use the same channel
            return(false);
        }