Skip to content

Commit 3b4b222

Browse files
authored
Merge pull request #1432 from rabbitmq/rabbitmq-dotnet-client-1429-6.x
Fix #1429 in `6.x`
2 parents 70de0eb + 27d5fb8 commit 3b4b222

File tree

3 files changed

+40
-31
lines changed

3 files changed

+40
-31
lines changed

projects/RabbitMQ.Client/client/api/ICredentialsRefresher.cs

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
//---------------------------------------------------------------------------
3131

3232
using System;
33-
using System.Collections.Generic;
33+
using System.Collections.Concurrent;
3434
using System.Diagnostics.Tracing;
3535
using System.Timers;
3636

@@ -59,11 +59,13 @@ public class TimerBasedCredentialRefresherEventSource : EventSource
5959
public void TriggeredTimer(string name) => WriteEvent(4, "TriggeredTimer", name);
6060
[Event(5)]
6161
public void RefreshedCredentials(string name, bool succesfully) => WriteEvent(5, "RefreshedCredentials", name, succesfully);
62+
[Event(6)]
63+
public void AlreadyRegistered(string name) => WriteEvent(6, "AlreadyRegistered", name);
6264
}
6365

6466
public class TimerBasedCredentialRefresher : ICredentialsRefresher
6567
{
66-
private Dictionary<ICredentialsProvider, Timer> _registrations = new Dictionary<ICredentialsProvider, Timer>();
68+
private readonly ConcurrentDictionary<ICredentialsProvider, Timer> _registrations = new ConcurrentDictionary<ICredentialsProvider, Timer>();
6769

6870
public ICredentialsProvider Register(ICredentialsProvider provider, NotifyCredentialRefreshed callback)
6971
{
@@ -72,25 +74,31 @@ public ICredentialsProvider Register(ICredentialsProvider provider, NotifyCreden
7274
return provider;
7375
}
7476

75-
_registrations.Add(provider, scheduleTimer(provider, callback));
76-
TimerBasedCredentialRefresherEventSource.Log.Registered(provider.Name);
77+
if (_registrations.TryAdd(provider, scheduleTimer(provider, callback)))
78+
{
79+
TimerBasedCredentialRefresherEventSource.Log.Registered(provider.Name);
80+
}
81+
else
82+
{
83+
TimerBasedCredentialRefresherEventSource.Log.AlreadyRegistered(provider.Name);
84+
}
85+
7786
return provider;
7887
}
7988

8089
public bool Unregister(ICredentialsProvider provider)
8190
{
82-
if (!_registrations.ContainsKey(provider))
91+
if (_registrations.TryRemove(provider, out Timer timer))
8392
{
84-
return false;
85-
}
86-
87-
var timer = _registrations[provider];
88-
if (timer != null)
89-
{
90-
TimerBasedCredentialRefresherEventSource.Log.Unregistered(provider.Name);
91-
timer.Stop();
92-
_registrations.Remove(provider);
93-
timer.Dispose();
93+
try
94+
{
95+
TimerBasedCredentialRefresherEventSource.Log.Unregistered(provider.Name);
96+
timer.Stop();
97+
}
98+
finally
99+
{
100+
timer.Dispose();
101+
}
94102
return true;
95103
}
96104
else

projects/TestApplications/OAuth2/Program.cs

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,26 +44,25 @@ public static void Main(string[] args)
4444
CredentialsRefresher = GetCredentialsRefresher()
4545
};
4646

47-
using (IConnection connection = connectionFactory.CreateConnection())
47+
using IConnection publishConnection = connectionFactory.CreateConnection();
48+
using IConnection consumingConnection = connectionFactory.CreateConnection();
49+
50+
using IModel publisher = declarePublisher(publishConnection);
51+
using IModel subscriber = declareConsumer(consumingConnection);
52+
53+
Publish(publisher);
54+
Consume(subscriber);
55+
56+
if (oauth2Options.TokenExpiresInSeconds > 0)
4857
{
49-
using (IModel publisher = declarePublisher(connection))
50-
using (IModel subscriber = declareConsumer(connection))
58+
for (int i = 0; i < 4; i++)
5159
{
60+
Console.WriteLine("Wait until Token expires. Attempt #" + (i + 1));
61+
Thread.Sleep((oauth2Options.TokenExpiresInSeconds + 10) * 1000);
62+
Console.WriteLine("Resuming ..");
5263
Publish(publisher);
64+
_doneEvent.Reset();
5365
Consume(subscriber);
54-
55-
if (oauth2Options.TokenExpiresInSeconds > 0)
56-
{
57-
for (int i = 0; i < 4; i++)
58-
{
59-
Console.WriteLine("Wait until Token expires. Attempt #" + (i + 1));
60-
Thread.Sleep((oauth2Options.TokenExpiresInSeconds + 10) * 1000);
61-
Console.WriteLine("Resuming ..");
62-
Publish(publisher);
63-
_doneEvent.Reset();
64-
Consume(subscriber);
65-
}
66-
}
6766
}
6867
}
6968
}

projects/Unit/APIApproval.Approve.verified.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,8 @@ namespace RabbitMQ.Client
671671
{
672672
public TimerBasedCredentialRefresherEventSource() { }
673673
public static RabbitMQ.Client.TimerBasedCredentialRefresherEventSource Log { get; }
674+
[System.Diagnostics.Tracing.Event(6)]
675+
public void AlreadyRegistered(string name) { }
674676
[System.Diagnostics.Tracing.Event(5)]
675677
public void RefreshedCredentials(string name, bool succesfully) { }
676678
[System.Diagnostics.Tracing.Event(1)]

0 commit comments

Comments
 (0)