Skip to content

Commit 4f912ed

Browse files
committed
Merge branch 'IDisposable' of https://github.com/paulomorgado/rabbitmq-dotnet-client into paulomorgado-IDisposable
2 parents 9f6715a + 037ddbf commit 4f912ed

File tree

8 files changed

+214
-148
lines changed

8 files changed

+214
-148
lines changed

projects/client/RabbitMQ.Client/src/client/impl/AutorecoveringConnection.cs

Lines changed: 42 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ public class AutorecoveringConnection : IConnection, IRecoverable
7676
private ConcurrentDictionary<RecordedBinding, byte> m_recordedBindings =
7777
new ConcurrentDictionary<RecordedBinding, byte>();
7878

79-
private List<EventHandler<ConnectionBlockedEventArgs>> m_recordedBlockedEventHandlers =
80-
new List<EventHandler<ConnectionBlockedEventArgs>>();
79+
private EventHandler<ConnectionBlockedEventArgs> m_recordedBlockedEventHandlers;
8180

8281
private IDictionary<string, RecordedConsumer> m_recordedConsumers =
8382
new ConcurrentDictionary<string, RecordedConsumer>();
@@ -88,16 +87,11 @@ public class AutorecoveringConnection : IConnection, IRecoverable
8887
private IDictionary<string, RecordedQueue> m_recordedQueues =
8988
new ConcurrentDictionary<string, RecordedQueue>();
9089

91-
private List<EventHandler<ShutdownEventArgs>> m_recordedShutdownEventHandlers =
92-
new List<EventHandler<ShutdownEventArgs>>();
93-
94-
private List<EventHandler<EventArgs>> m_recordedUnblockedEventHandlers =
95-
new List<EventHandler<EventArgs>>();
96-
90+
private EventHandler<ShutdownEventArgs> m_recordedShutdownEventHandlers;
91+
private EventHandler<EventArgs> m_recordedUnblockedEventHandlers;
9792
private EventHandler<ConsumerTagChangedAfterRecoveryEventArgs> m_consumerTagChange;
9893
private EventHandler<QueueNameChangedAfterRecoveryEventArgs> m_queueNameChange;
9994
private EventHandler<EventArgs> m_recovery;
100-
10195
private EventHandler<ConnectionRecoveryErrorEventArgs> m_connectionRecoveryError;
10296

10397
public AutorecoveringConnection(ConnectionFactory factory, string clientProvidedName = null)
@@ -183,15 +177,15 @@ public event EventHandler<ConnectionBlockedEventArgs> ConnectionBlocked
183177
{
184178
lock (m_eventLock)
185179
{
186-
m_recordedBlockedEventHandlers.Add(value);
180+
m_recordedBlockedEventHandlers += value;
187181
m_delegate.ConnectionBlocked += value;
188182
}
189183
}
190184
remove
191185
{
192186
lock (m_eventLock)
193187
{
194-
m_recordedBlockedEventHandlers.Remove(value);
188+
m_recordedBlockedEventHandlers -= value;
195189
m_delegate.ConnectionBlocked -= value;
196190
}
197191
}
@@ -203,15 +197,15 @@ public event EventHandler<ShutdownEventArgs> ConnectionShutdown
203197
{
204198
lock (m_eventLock)
205199
{
206-
m_recordedShutdownEventHandlers.Add(value);
200+
m_recordedShutdownEventHandlers += value;
207201
m_delegate.ConnectionShutdown += value;
208202
}
209203
}
210204
remove
211205
{
212206
lock (m_eventLock)
213207
{
214-
m_recordedShutdownEventHandlers.Remove(value);
208+
m_recordedShutdownEventHandlers -= value;
215209
m_delegate.ConnectionShutdown -= value;
216210
}
217211
}
@@ -223,15 +217,15 @@ public event EventHandler<EventArgs> ConnectionUnblocked
223217
{
224218
lock (m_eventLock)
225219
{
226-
m_recordedUnblockedEventHandlers.Add(value);
220+
m_recordedUnblockedEventHandlers += value;
227221
m_delegate.ConnectionUnblocked += value;
228222
}
229223
}
230224
remove
231225
{
232226
lock (m_eventLock)
233227
{
234-
m_recordedUnblockedEventHandlers.Remove(value);
228+
m_recordedUnblockedEventHandlers -= value;
235229
m_delegate.ConnectionUnblocked -= value;
236230
}
237231
}
@@ -492,7 +486,7 @@ public void DeleteRecordedExchange(string name)
492486
// find bindings that need removal, check if some auto-delete exchanges
493487
// might need the same
494488
var bs = m_recordedBindings.Keys.Where(b => name.Equals(b.Destination));
495-
foreach (RecordedBinding b in bs)
489+
foreach (var b in bs)
496490
{
497491
DeleteRecordedBinding(b);
498492
MaybeDeleteRecordedAutoDeleteExchange(b.Source);
@@ -508,7 +502,7 @@ public void DeleteRecordedQueue(string name)
508502
// find bindings that need removal, check if some auto-delete exchanges
509503
// might need the same
510504
var bs = m_recordedBindings.Keys.Where(b => name.Equals(b.Destination));
511-
foreach (RecordedBinding b in bs)
505+
foreach (var b in bs)
512506
{
513507
DeleteRecordedBinding(b);
514508
MaybeDeleteRecordedAutoDeleteExchange(b.Source);
@@ -651,10 +645,7 @@ private void Init(IFrameHandler fh)
651645
lock (m_eventLock)
652646
{
653647
ConnectionShutdown += recoveryListener;
654-
if (!m_recordedShutdownEventHandlers.Contains(recoveryListener))
655-
{
656-
m_recordedShutdownEventHandlers.Add(recoveryListener);
657-
}
648+
m_recordedShutdownEventHandlers += recoveryListener;
658649
}
659650
}
660651

@@ -747,18 +738,32 @@ public void HandleConnectionUnblocked()
747738

748739
void IDisposable.Dispose()
749740
{
750-
try
751-
{
752-
Abort();
753-
}
754-
catch(Exception)
755-
{
756-
// TODO: log
757-
}
758-
finally
741+
Dispose(true);
742+
}
743+
744+
protected virtual void Dispose(bool disposing)
745+
{
746+
if (disposing)
759747
{
760-
m_models.Clear();
748+
// dispose managed resources
749+
try
750+
{
751+
Abort();
752+
}
753+
catch (Exception)
754+
{
755+
// TODO: log
756+
}
757+
finally
758+
{
759+
m_models.Clear();
760+
m_recordedBlockedEventHandlers = null;
761+
m_recordedShutdownEventHandlers = null;
762+
m_recordedUnblockedEventHandlers = null;
763+
}
761764
}
765+
766+
// dispose unmanaged resources
762767
}
763768

764769
protected void EnsureIsOpen()
@@ -815,13 +820,9 @@ protected void RecoverBindings()
815820

816821
protected void RecoverConnectionBlockedHandlers()
817822
{
818-
List<EventHandler<ConnectionBlockedEventArgs>> handler = m_recordedBlockedEventHandlers;
819-
if (handler != null)
823+
lock (m_eventLock)
820824
{
821-
foreach (EventHandler<ConnectionBlockedEventArgs> eh in handler)
822-
{
823-
m_delegate.ConnectionBlocked += eh;
824-
}
825+
m_delegate.ConnectionBlocked += m_recordedBlockedEventHandlers;
825826
}
826827
}
827828

@@ -871,22 +872,12 @@ protected bool RecoverConnectionDelegate()
871872

872873
protected void RecoverConnectionShutdownHandlers()
873874
{
874-
foreach (EventHandler<ShutdownEventArgs> eh in m_recordedShutdownEventHandlers)
875-
{
876-
m_delegate.ConnectionShutdown += eh;
877-
}
875+
m_delegate.ConnectionShutdown += m_recordedShutdownEventHandlers;
878876
}
879877

880878
protected void RecoverConnectionUnblockedHandlers()
881879
{
882-
List<EventHandler<EventArgs>> handler = m_recordedUnblockedEventHandlers;
883-
if (handler != null)
884-
{
885-
foreach (EventHandler<EventArgs> eh in handler)
886-
{
887-
m_delegate.ConnectionUnblocked += eh;
888-
}
889-
}
880+
m_delegate.ConnectionUnblocked += m_recordedUnblockedEventHandlers;
890881
}
891882

892883
protected void RecoverConsumers()
@@ -1054,8 +1045,8 @@ protected void RunRecoveryEventHandlers()
10541045
protected bool ShouldTriggerConnectionRecovery(ShutdownEventArgs args)
10551046
{
10561047
return (args.Initiator == ShutdownInitiator.Peer ||
1057-
// happens when EOF is reached, e.g. due to RabbitMQ node
1058-
// connectivity loss or abrupt shutdown
1048+
// happens when EOF is reached, e.g. due to RabbitMQ node
1049+
// connectivity loss or abrupt shutdown
10591050
args.Initiator == ShutdownInitiator.Library);
10601051
}
10611052
}

0 commit comments

Comments
 (0)