diff --git a/projects/Applications/GH-1749/Program.cs b/projects/Applications/GH-1749/Program.cs index 8ebc52778..a1cdf9cbb 100644 --- a/projects/Applications/GH-1749/Program.cs +++ b/projects/Applications/GH-1749/Program.cs @@ -52,18 +52,28 @@ protected override Task OnCancelAsync(string[] consumerTags, CancellationToken c static class Program { + const string DefaultHostName = "localhost"; const string ConnectionClientProvidedName = "GH_1749"; - - static readonly Util s_util = new(); static readonly CancellationTokenSource s_cancellationTokenSource = new(); static readonly CancellationToken s_cancellationToken = s_cancellationTokenSource.Token; + static Util? s_util; + static async Task Main(string[] args) { + string hostname = DefaultHostName; + if (args.Length > 0) + { + hostname = args[0]; + } + + s_util = new Util(hostname, "guest", "guest"); + AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException; ConnectionFactory connectionFactory = new() { + HostName = hostname, AutomaticRecoveryEnabled = true, UserName = "guest", Password = "guest", @@ -87,9 +97,10 @@ static async Task Main(string[] args) connection.ConnectionRecoveryErrorAsync += Connection_ConnectionRecoveryErrorAsync; - connection.ConnectionShutdownAsync += async (object sender, ShutdownEventArgs ea) => + connection.ConnectionShutdownAsync += (object sender, ShutdownEventArgs ea) => { Console.WriteLine("{0} [INFO] saw ConnectionShutdownAsync, event: {1}", Now, ea); + return Task.CompletedTask; }; connection.ConsumerTagChangeAfterRecoveryAsync += Connection_ConsumerTagChangeAfterRecoveryAsync; @@ -99,6 +110,9 @@ static async Task Main(string[] args) await using var channel = await connection.CreateChannelAsync(options: channelOptions); + channel.CallbackExceptionAsync += Channel_CallbackExceptionAsync; + channel.ChannelShutdownAsync += Channel_ChannelShutdownAsync; + QueueDeclareOk queue = await channel.QueueDeclareAsync(); var consumer = new GH1749Consumer(channel); @@ -112,6 +126,11 @@ static async Task Main(string[] args) static async Task CloseConnectionAsync() { + if (s_util is null) + { + throw new NullReferenceException("s_util"); + } + try { Console.WriteLine("{0} [INFO] start closing connection: {1}", Now, ConnectionClientProvidedName); @@ -126,16 +145,31 @@ static async Task CloseConnectionAsync() private static string Now => Util.Now; - private static void CurrentDomain_FirstChanceException(object? sender, FirstChanceExceptionEventArgs e) + private static Task Channel_CallbackExceptionAsync(object sender, CallbackExceptionEventArgs ea) + { + Console.WriteLine("{0} [INFO] channel saw CallbackExceptionAsync, event: {1}", Now, ea); + Console.WriteLine("{0} [INFO] channel CallbackExceptionAsync, exception: {1}", Now, ea.Exception); + return Task.CompletedTask; + } + + private static Task Channel_ChannelShutdownAsync(object sender, ShutdownEventArgs ea) { - Console.WriteLine("{0} [INFO] saw FirstChanceException, exception: {1}", Now, e.Exception); + Console.WriteLine("{0} [INFO] saw ChannelShutdownAsync, event: {1}", Now, ea); + return Task.CompletedTask; } + private static void CurrentDomain_FirstChanceException(object? sender, FirstChanceExceptionEventArgs e) + { + if (e.Exception is ObjectDisposedException) + { + Console.WriteLine("{0} [INFO] saw FirstChanceException, exception: {1}", Now, e.Exception); + } + } private static Task Connection_CallbackExceptionAsync(object sender, CallbackExceptionEventArgs ea) { - Console.WriteLine("{0} [INFO] saw CallbackExceptionAsync, event: {1}", Now, ea); - Console.WriteLine("{0} [INFO] CallbackExceptionAsync, exception: {1}", Now, ea.Exception); + Console.WriteLine("{0} [INFO] connection saw CallbackExceptionAsync, event: {1}", Now, ea); + Console.WriteLine("{0} [INFO] connection CallbackExceptionAsync, exception: {1}", Now, ea.Exception); return Task.CompletedTask; } diff --git a/projects/Applications/GH-1749/Util.cs b/projects/Applications/GH-1749/Util.cs index b2f744033..48faf79b8 100644 --- a/projects/Applications/GH-1749/Util.cs +++ b/projects/Applications/GH-1749/Util.cs @@ -42,11 +42,11 @@ public class Util : IDisposable private readonly ManagementClient _managementClient; private static readonly bool s_isWindows = false; - public Util() : this("guest", "guest") + public Util() : this("localhost", "guest", "guest") { } - public Util(string managementUsername, string managementPassword) + public Util(string hostname, string managementUsername, string managementPassword) { if (string.IsNullOrEmpty(managementUsername)) { @@ -58,7 +58,7 @@ public Util(string managementUsername, string managementPassword) throw new ArgumentNullException(nameof(managementPassword)); } - var managementUri = new Uri("http://localhost:15672"); + var managementUri = new Uri($"http://{hostname}:15672"); _managementClient = new ManagementClient(managementUri, managementUsername, managementPassword); }