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."); }
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()); }
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); }