Skip to content

Commit

Permalink
Merge pull request #1432 from rabbitmq/rabbitmq-dotnet-client-1429-6.x
Browse files Browse the repository at this point in the history
Fix #1429 in `6.x`
  • Loading branch information
lukebakken authored Dec 1, 2023
2 parents 70de0eb + 27d5fb8 commit 3b4b222
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 31 deletions.
38 changes: 23 additions & 15 deletions projects/RabbitMQ.Client/client/api/ICredentialsRefresher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
//---------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Diagnostics.Tracing;
using System.Timers;

Expand Down Expand Up @@ -59,11 +59,13 @@ public class TimerBasedCredentialRefresherEventSource : EventSource
public void TriggeredTimer(string name) => WriteEvent(4, "TriggeredTimer", name);
[Event(5)]
public void RefreshedCredentials(string name, bool succesfully) => WriteEvent(5, "RefreshedCredentials", name, succesfully);
[Event(6)]
public void AlreadyRegistered(string name) => WriteEvent(6, "AlreadyRegistered", name);
}

public class TimerBasedCredentialRefresher : ICredentialsRefresher
{
private Dictionary<ICredentialsProvider, Timer> _registrations = new Dictionary<ICredentialsProvider, Timer>();
private readonly ConcurrentDictionary<ICredentialsProvider, Timer> _registrations = new ConcurrentDictionary<ICredentialsProvider, Timer>();

public ICredentialsProvider Register(ICredentialsProvider provider, NotifyCredentialRefreshed callback)
{
Expand All @@ -72,25 +74,31 @@ public ICredentialsProvider Register(ICredentialsProvider provider, NotifyCreden
return provider;
}

_registrations.Add(provider, scheduleTimer(provider, callback));
TimerBasedCredentialRefresherEventSource.Log.Registered(provider.Name);
if (_registrations.TryAdd(provider, scheduleTimer(provider, callback)))
{
TimerBasedCredentialRefresherEventSource.Log.Registered(provider.Name);
}
else
{
TimerBasedCredentialRefresherEventSource.Log.AlreadyRegistered(provider.Name);
}

return provider;
}

public bool Unregister(ICredentialsProvider provider)
{
if (!_registrations.ContainsKey(provider))
if (_registrations.TryRemove(provider, out Timer timer))
{
return false;
}

var timer = _registrations[provider];
if (timer != null)
{
TimerBasedCredentialRefresherEventSource.Log.Unregistered(provider.Name);
timer.Stop();
_registrations.Remove(provider);
timer.Dispose();
try
{
TimerBasedCredentialRefresherEventSource.Log.Unregistered(provider.Name);
timer.Stop();
}
finally
{
timer.Dispose();
}
return true;
}
else
Expand Down
31 changes: 15 additions & 16 deletions projects/TestApplications/OAuth2/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,26 +44,25 @@ public static void Main(string[] args)
CredentialsRefresher = GetCredentialsRefresher()
};

using (IConnection connection = connectionFactory.CreateConnection())
using IConnection publishConnection = connectionFactory.CreateConnection();
using IConnection consumingConnection = connectionFactory.CreateConnection();

using IModel publisher = declarePublisher(publishConnection);
using IModel subscriber = declareConsumer(consumingConnection);

Publish(publisher);
Consume(subscriber);

if (oauth2Options.TokenExpiresInSeconds > 0)
{
using (IModel publisher = declarePublisher(connection))
using (IModel subscriber = declareConsumer(connection))
for (int i = 0; i < 4; i++)
{
Console.WriteLine("Wait until Token expires. Attempt #" + (i + 1));
Thread.Sleep((oauth2Options.TokenExpiresInSeconds + 10) * 1000);
Console.WriteLine("Resuming ..");
Publish(publisher);
_doneEvent.Reset();
Consume(subscriber);

if (oauth2Options.TokenExpiresInSeconds > 0)
{
for (int i = 0; i < 4; i++)
{
Console.WriteLine("Wait until Token expires. Attempt #" + (i + 1));
Thread.Sleep((oauth2Options.TokenExpiresInSeconds + 10) * 1000);
Console.WriteLine("Resuming ..");
Publish(publisher);
_doneEvent.Reset();
Consume(subscriber);
}
}
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions projects/Unit/APIApproval.Approve.verified.txt
Original file line number Diff line number Diff line change
Expand Up @@ -671,6 +671,8 @@ namespace RabbitMQ.Client
{
public TimerBasedCredentialRefresherEventSource() { }
public static RabbitMQ.Client.TimerBasedCredentialRefresherEventSource Log { get; }
[System.Diagnostics.Tracing.Event(6)]
public void AlreadyRegistered(string name) { }
[System.Diagnostics.Tracing.Event(5)]
public void RefreshedCredentials(string name, bool succesfully) { }
[System.Diagnostics.Tracing.Event(1)]
Expand Down

0 comments on commit 3b4b222

Please sign in to comment.