Skip to content

Commit 037ddbf

Browse files
committed
Implement IDisposable pattern and release resources on Dispose.
1 parent c3c6df9 commit 037ddbf

File tree

8 files changed

+223
-143
lines changed

8 files changed

+223
-143
lines changed

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

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

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

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

91-
protected List<EventHandler<ShutdownEventArgs>> m_recordedShutdownEventHandlers =
92-
new List<EventHandler<ShutdownEventArgs>>();
90+
protected EventHandler<ShutdownEventArgs> m_recordedShutdownEventHandlers;
9391

94-
protected List<EventHandler<EventArgs>> m_recordedUnblockedEventHandlers =
95-
new List<EventHandler<EventArgs>>();
92+
protected EventHandler<EventArgs> m_recordedUnblockedEventHandlers;
9693

9794
private EventHandler<ConsumerTagChangedAfterRecoveryEventArgs> m_consumerTagChange;
9895
private EventHandler<QueueNameChangedAfterRecoveryEventArgs> m_queueNameChange;
@@ -183,15 +180,15 @@ public event EventHandler<ConnectionBlockedEventArgs> ConnectionBlocked
183180
{
184181
lock (m_eventLock)
185182
{
186-
m_recordedBlockedEventHandlers.Add(value);
183+
m_recordedBlockedEventHandlers += value;
187184
m_delegate.ConnectionBlocked += value;
188185
}
189186
}
190187
remove
191188
{
192189
lock (m_eventLock)
193190
{
194-
m_recordedBlockedEventHandlers.Remove(value);
191+
m_recordedBlockedEventHandlers -= value;
195192
m_delegate.ConnectionBlocked -= value;
196193
}
197194
}
@@ -203,15 +200,15 @@ public event EventHandler<ShutdownEventArgs> ConnectionShutdown
203200
{
204201
lock (m_eventLock)
205202
{
206-
m_recordedShutdownEventHandlers.Add(value);
203+
m_recordedShutdownEventHandlers += value;
207204
m_delegate.ConnectionShutdown += value;
208205
}
209206
}
210207
remove
211208
{
212209
lock (m_eventLock)
213210
{
214-
m_recordedShutdownEventHandlers.Remove(value);
211+
m_recordedShutdownEventHandlers -= value;
215212
m_delegate.ConnectionShutdown -= value;
216213
}
217214
}
@@ -223,15 +220,15 @@ public event EventHandler<EventArgs> ConnectionUnblocked
223220
{
224221
lock (m_eventLock)
225222
{
226-
m_recordedUnblockedEventHandlers.Add(value);
223+
m_recordedUnblockedEventHandlers += value;
227224
m_delegate.ConnectionUnblocked += value;
228225
}
229226
}
230227
remove
231228
{
232229
lock (m_eventLock)
233230
{
234-
m_recordedUnblockedEventHandlers.Remove(value);
231+
m_recordedUnblockedEventHandlers -= value;
235232
m_delegate.ConnectionUnblocked -= value;
236233
}
237234
}
@@ -492,7 +489,7 @@ public void DeleteRecordedExchange(string name)
492489
// find bindings that need removal, check if some auto-delete exchanges
493490
// might need the same
494491
var bs = m_recordedBindings.Keys.Where(b => name.Equals(b.Destination));
495-
foreach (RecordedBinding b in bs)
492+
foreach (var b in bs)
496493
{
497494
DeleteRecordedBinding(b);
498495
MaybeDeleteRecordedAutoDeleteExchange(b.Source);
@@ -508,7 +505,7 @@ public void DeleteRecordedQueue(string name)
508505
// find bindings that need removal, check if some auto-delete exchanges
509506
// might need the same
510507
var bs = m_recordedBindings.Keys.Where(b => name.Equals(b.Destination));
511-
foreach (RecordedBinding b in bs)
508+
foreach (var b in bs)
512509
{
513510
DeleteRecordedBinding(b);
514511
MaybeDeleteRecordedAutoDeleteExchange(b.Source);
@@ -651,10 +648,7 @@ private void Init(IFrameHandler fh)
651648
lock (m_eventLock)
652649
{
653650
ConnectionShutdown += recoveryListener;
654-
if (!m_recordedShutdownEventHandlers.Contains(recoveryListener))
655-
{
656-
m_recordedShutdownEventHandlers.Add(recoveryListener);
657-
}
651+
m_recordedShutdownEventHandlers += recoveryListener;
658652
}
659653
}
660654

@@ -747,18 +741,33 @@ public void HandleConnectionUnblocked()
747741

748742
void IDisposable.Dispose()
749743
{
750-
try
751-
{
752-
Abort();
753-
}
754-
catch(Exception)
755-
{
756-
// TODO: log
757-
}
758-
finally
744+
Dispose(true);
745+
GC.SuppressFinalize(this);
746+
}
747+
748+
protected virtual void Dispose(bool disposing)
749+
{
750+
if (disposing)
759751
{
760-
m_models.Clear();
752+
// dispose managed resources
753+
try
754+
{
755+
Abort();
756+
}
757+
catch (Exception)
758+
{
759+
// TODO: log
760+
}
761+
finally
762+
{
763+
m_models.Clear();
764+
m_recordedBlockedEventHandlers = null;
765+
m_recordedShutdownEventHandlers = null;
766+
m_recordedUnblockedEventHandlers = null;
767+
}
761768
}
769+
770+
// dispose unmanaged resources
762771
}
763772

764773
protected void EnsureIsOpen()
@@ -815,13 +824,9 @@ protected void RecoverBindings()
815824

816825
protected void RecoverConnectionBlockedHandlers()
817826
{
818-
List<EventHandler<ConnectionBlockedEventArgs>> handler = m_recordedBlockedEventHandlers;
819-
if (handler != null)
827+
lock (m_eventLock)
820828
{
821-
foreach (EventHandler<ConnectionBlockedEventArgs> eh in handler)
822-
{
823-
m_delegate.ConnectionBlocked += eh;
824-
}
829+
m_delegate.ConnectionBlocked += m_recordedBlockedEventHandlers;
825830
}
826831
}
827832

@@ -871,22 +876,12 @@ protected bool RecoverConnectionDelegate()
871876

872877
protected void RecoverConnectionShutdownHandlers()
873878
{
874-
foreach (EventHandler<ShutdownEventArgs> eh in m_recordedShutdownEventHandlers)
875-
{
876-
m_delegate.ConnectionShutdown += eh;
877-
}
879+
m_delegate.ConnectionShutdown += m_recordedShutdownEventHandlers;
878880
}
879881

880882
protected void RecoverConnectionUnblockedHandlers()
881883
{
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-
}
884+
m_delegate.ConnectionUnblocked += m_recordedUnblockedEventHandlers;
890885
}
891886

892887
protected void RecoverConsumers()
@@ -1054,8 +1049,8 @@ protected void RunRecoveryEventHandlers()
10541049
protected bool ShouldTriggerConnectionRecovery(ShutdownEventArgs args)
10551050
{
10561051
return (args.Initiator == ShutdownInitiator.Peer ||
1057-
// happens when EOF is reached, e.g. due to RabbitMQ node
1058-
// connectivity loss or abrupt shutdown
1052+
// happens when EOF is reached, e.g. due to RabbitMQ node
1053+
// connectivity loss or abrupt shutdown
10591054
args.Initiator == ShutdownInitiator.Library);
10601055
}
10611056
}

0 commit comments

Comments
 (0)