From 484cf6da7ad6ab0a5ed6538b09ccd955ce23cf10 Mon Sep 17 00:00:00 2001 From: Luke Bakken Date: Wed, 29 May 2024 17:01:23 -0700 Subject: [PATCH] Handle AppDomain unload Fixes #826 --- .../client/api/ConnectionFactory.cs | 13 +++++++------ .../impl/AutorecoveringConnection.Recovery.cs | 18 +++++++++++++++--- .../client/impl/Connection.Receive.cs | 13 +++++++++++++ 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/projects/RabbitMQ.Client/client/api/ConnectionFactory.cs b/projects/RabbitMQ.Client/client/api/ConnectionFactory.cs index 1bf4db3f28..93c62e561e 100644 --- a/projects/RabbitMQ.Client/client/api/ConnectionFactory.cs +++ b/projects/RabbitMQ.Client/client/api/ConnectionFactory.cs @@ -723,14 +723,15 @@ private List LocalEndpoints() private static string EnsureClientProvidedNameLength(string clientProvidedName) { - if (clientProvidedName.Length > InternalConstants.DefaultRabbitMqMaxClientProvideNameLength) + if (clientProvidedName != null) { - return clientProvidedName.Substring(0, InternalConstants.DefaultRabbitMqMaxClientProvideNameLength); - } - else - { - return clientProvidedName; + if (clientProvidedName.Length > InternalConstants.DefaultRabbitMqMaxClientProvideNameLength) + { + return clientProvidedName.Substring(0, InternalConstants.DefaultRabbitMqMaxClientProvideNameLength); + } } + + return clientProvidedName; } } } diff --git a/projects/RabbitMQ.Client/client/impl/AutorecoveringConnection.Recovery.cs b/projects/RabbitMQ.Client/client/impl/AutorecoveringConnection.Recovery.cs index 67310eb71d..4d95a395e5 100644 --- a/projects/RabbitMQ.Client/client/impl/AutorecoveringConnection.Recovery.cs +++ b/projects/RabbitMQ.Client/client/impl/AutorecoveringConnection.Recovery.cs @@ -71,11 +71,23 @@ static bool ShouldTriggerConnectionRecovery(ShutdownEventArgs args) } } - // happens when EOF is reached, e.g. due to RabbitMQ node - // connectivity loss or abrupt shutdown if (args.Initiator == ShutdownInitiator.Library) { - return true; + /* + * https://github.com/rabbitmq/rabbitmq-dotnet-client/issues/826 + * Happens when an AppDomain is unloaded + */ + if (args.Exception is ThreadAbortException && + args.ReplyCode == Constants.InternalError) + { + return false; + } + else + { + // happens when EOF is reached, e.g. due to RabbitMQ node + // connectivity loss or abrupt shutdown + return true; + } } return false; diff --git a/projects/RabbitMQ.Client/client/impl/Connection.Receive.cs b/projects/RabbitMQ.Client/client/impl/Connection.Receive.cs index 1f6a33ef6f..eaa31ec37c 100644 --- a/projects/RabbitMQ.Client/client/impl/Connection.Receive.cs +++ b/projects/RabbitMQ.Client/client/impl/Connection.Receive.cs @@ -53,6 +53,19 @@ private async Task MainLoop() await ReceiveLoopAsync(mainLoopToken) .ConfigureAwait(false); } +#if NETSTANDARD + catch (ThreadAbortException taex) + { + /* + * https://github.com/rabbitmq/rabbitmq-dotnet-client/issues/826 + */ + var ea = new ShutdownEventArgs(ShutdownInitiator.Library, + Constants.InternalError, + "Thread aborted (AppDomain unloaded?)", + exception: taex); + HandleMainLoopException(ea); + } +#endif catch (EndOfStreamException eose) { // Possible heartbeat exception