2021-09-04 09:33:59 +00:00
using System ;
using CommandLine ;
using RabbitMQ.Client ;
using RabbitMQ.Client.Exceptions ;
2021-09-04 12:01:03 +00:00
using Tapeti.Cmd.ConsoleHelper ;
2021-09-04 09:33:59 +00:00
namespace Tapeti.Cmd.Verbs
{
[Verb("removequeue", HelpText = "Removes a durable queue.")]
[ExecutableVerb(typeof(RemoveQueueVerb))]
public class RemoveQueueOptions : BaseConnectionOptions
{
[Option('q', "queue", Required = true, HelpText = "The name of the queue to remove.")]
public string QueueName { get ; set ; }
[Option("confirm", HelpText = "Confirms the removal of the specified queue. If not provided, an interactive prompt will ask for confirmation.", Default = false)]
public bool Confirm { get ; set ; }
[Option("confirmpurge", HelpText = "Confirms the removal of the specified queue even if there still are messages in the queue. If not provided, an interactive prompt will ask for confirmation.", Default = false)]
public bool ConfirmPurge { get ; set ; }
}
public class RemoveQueueVerb : IVerbExecuter
{
private readonly RemoveQueueOptions options ;
public RemoveQueueVerb ( RemoveQueueOptions options )
{
this . options = options ;
}
2021-09-04 12:01:03 +00:00
public void Execute ( IConsole console )
2021-09-04 09:33:59 +00:00
{
2021-09-04 12:01:03 +00:00
var consoleWriter = console . GetPermanentWriter ( ) ;
2021-09-04 09:33:59 +00:00
if ( ! options . Confirm )
{
2021-09-04 12:01:03 +00:00
if ( ! consoleWriter . ConfirmYesNo ( $"Do you want to remove the queue '{options.QueueName}'?" ) )
2021-09-04 09:33:59 +00:00
return ;
}
var factory = new ConnectionFactory
{
HostName = options . Host ,
Port = options . Port ,
VirtualHost = options . VirtualHost ,
UserName = options . Username ,
Password = options . Password
} ;
uint messageCount ;
try
{
using var connection = factory . CreateConnection ( ) ;
using var channel = connection . CreateModel ( ) ;
messageCount = channel . QueueDelete ( options . QueueName , true , true ) ;
}
catch ( OperationInterruptedException e )
{
if ( e . ShutdownReason . ReplyCode = = 406 )
{
if ( ! options . ConfirmPurge )
{
2021-09-04 12:01:03 +00:00
if ( ! consoleWriter . ConfirmYesNo ( $"There are messages remaining. Do you want to purge the queue '{options.QueueName}'?" ) )
2021-09-04 09:33:59 +00:00
return ;
}
using var connection = factory . CreateConnection ( ) ;
using var channel = connection . CreateModel ( ) ;
messageCount = channel . QueueDelete ( options . QueueName , true , false ) ;
}
else
throw ;
}
2021-09-04 12:01:03 +00:00
consoleWriter . WriteLine ( messageCount = = 0
2021-09-04 09:33:59 +00:00
? $"Empty or non-existent queue '{options.QueueName}' removed."
: $"{messageCount} message{(messageCount != 1 ? " s " : " ")} purged while removing '{options.QueueName}'." ) ;
}
}
}