Skip to content

Commit 6a95d77

Browse files
Travis Nickelsbording
authored andcommitted
Change lock to semaphoreSlim
1 parent b2a5afc commit 6a95d77

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

src/ServiceControl.Transports.RabbitMQ/ConnectionFactory.cs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
using System.Net.Security;
55
using System.Security.Authentication;
66
using System.Security.Cryptography.X509Certificates;
7+
using System.Threading;
8+
using System.Threading.Tasks;
79
using global::RabbitMQ.Client;
810

911
class ConnectionFactory
1012
{
1113
readonly string endpointName;
1214
readonly global::RabbitMQ.Client.ConnectionFactory connectionFactory;
13-
readonly object lockObject = new object();
15+
readonly SemaphoreSlim semaphoreSlim = new(1, 1);
1416

1517
public ConnectionFactory(string endpointName, ConnectionConfiguration connectionConfiguration,
1618
X509Certificate2Collection clientCertificateCollection, bool disableRemoteCertificateValidation,
@@ -76,21 +78,26 @@ public ConnectionFactory(string endpointName, ConnectionConfiguration connection
7678
}
7779
}
7880

79-
public IConnection CreatePublishConnection() => CreateConnection($"{endpointName} Publish", false);
81+
public async Task<IConnection> CreatePublishConnection(CancellationToken cancellationToken) => await CreateConnection($"{endpointName} Publish", false, cancellationToken);
8082

81-
public IConnection CreateAdministrationConnection() => CreateConnection($"{endpointName} Administration", false);
83+
public Task<IConnection> CreateAdministrationConnection(CancellationToken cancellationToken) => CreateConnection($"{endpointName} Administration", false, cancellationToken);
8284

83-
public IConnection CreateConnection(string connectionName, bool automaticRecoveryEnabled = true)
85+
public async Task<IConnection> CreateConnection(string connectionName, bool automaticRecoveryEnabled = true, CancellationToken cancellationToken = default)
8486
{
85-
lock (lockObject)
87+
await semaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false);
88+
try
8689
{
8790
connectionFactory.AutomaticRecoveryEnabled = automaticRecoveryEnabled;
8891
connectionFactory.ClientProperties["connected"] = DateTime.UtcNow.ToString("G");
8992

90-
var connection = connectionFactory.CreateConnection(connectionName);
93+
var connection = await connectionFactory.CreateConnectionAsync(connectionName, cancellationToken);
9194

9295
return connection;
9396
}
97+
finally
98+
{
99+
_ = semaphoreSlim.Release();
100+
}
94101
}
95102
}
96103
}

0 commit comments

Comments
 (0)