diff --git a/src/HealthChecks.Rabbitmq/RabbitMQHealthCheck.cs b/src/HealthChecks.Rabbitmq/RabbitMQHealthCheck.cs index 2e94f682c4..f59ba51888 100644 --- a/src/HealthChecks.Rabbitmq/RabbitMQHealthCheck.cs +++ b/src/HealthChecks.Rabbitmq/RabbitMQHealthCheck.cs @@ -28,6 +28,7 @@ public RabbitMQHealthCheck(RabbitMQHealthCheckOptions options) /// public Task CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default) { + // TODO: cancellationToken unused, see https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/issues/714 try { using var model = EnsureConnection().CreateModel(); @@ -52,9 +53,14 @@ private IConnection EnsureConnection() { Uri = _options.ConnectionUri, AutomaticRecoveryEnabled = true, - UseBackgroundThreadsForIO = true, + UseBackgroundThreadsForIO = true }; + if (_options.RequestedConnectionTimeout is not null) + { + ((ConnectionFactory)factory).RequestedConnectionTimeout = _options.RequestedConnectionTimeout.Value; + } + if (_options.Ssl is not null) { ((ConnectionFactory)factory).Ssl = _options.Ssl; diff --git a/src/HealthChecks.Rabbitmq/RabbitMQHealthCheckOptions.cs b/src/HealthChecks.Rabbitmq/RabbitMQHealthCheckOptions.cs index 802f44c570..d164fe94f3 100644 --- a/src/HealthChecks.Rabbitmq/RabbitMQHealthCheckOptions.cs +++ b/src/HealthChecks.Rabbitmq/RabbitMQHealthCheckOptions.cs @@ -34,4 +34,9 @@ public class RabbitMQHealthCheckOptions /// Must be used in conjunction with the property. /// public SslOption? Ssl { get; set; } + + /// + /// Timeout setting for connection attempts. + /// + public TimeSpan? RequestedConnectionTimeout { get; set; } } diff --git a/test/HealthChecks.RabbitMQ.Tests/Functional/RabbitHealthCheckTests.cs b/test/HealthChecks.RabbitMQ.Tests/Functional/RabbitHealthCheckTests.cs index 23abf311fe..e477cc3e8e 100644 --- a/test/HealthChecks.RabbitMQ.Tests/Functional/RabbitHealthCheckTests.cs +++ b/test/HealthChecks.RabbitMQ.Tests/Functional/RabbitHealthCheckTests.cs @@ -1,4 +1,6 @@ using System.Net; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; using RabbitMQ.Client; namespace HealthChecks.RabbitMQ.Tests.Functional; @@ -272,4 +274,30 @@ public async Task two_rabbitmq_health_check() response1.StatusCode.ShouldBe(HttpStatusCode.OK); response2.StatusCode.ShouldBe(HttpStatusCode.ServiceUnavailable); } + + // https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/issues/714 + [Fact] + public async Task should_respect_timeout() + { + var services = new ServiceCollection(); + + services + .AddLogging() + .AddHealthChecks() + .AddRabbitMQ(opt => + { + opt.RequestedConnectionTimeout = TimeSpan.FromSeconds(1); + opt.ConnectionUri = new Uri($"amqps://user:pwd@invalid-host:5672"); + }, + timeout: TimeSpan.FromSeconds(10)); + + using var provider = services.BuildServiceProvider(); + var healthCheckService = provider.GetRequiredService(); + var start = DateTime.Now; + using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)); + var report = await healthCheckService.CheckHealthAsync(cts.Token).ConfigureAwait(false); + report.Status.ShouldBe(HealthStatus.Unhealthy); + var end = DateTime.Now; + (end - start).ShouldBeLessThan(TimeSpan.FromSeconds(10)); + } } diff --git a/test/HealthChecks.RabbitMQ.Tests/HealthChecks.Rabbitmq.approved.txt b/test/HealthChecks.RabbitMQ.Tests/HealthChecks.Rabbitmq.approved.txt index 7cdc844702..e4e522964f 100644 --- a/test/HealthChecks.RabbitMQ.Tests/HealthChecks.Rabbitmq.approved.txt +++ b/test/HealthChecks.RabbitMQ.Tests/HealthChecks.Rabbitmq.approved.txt @@ -11,6 +11,7 @@ namespace HealthChecks.RabbitMQ public RabbitMQ.Client.IConnection? Connection { get; set; } public RabbitMQ.Client.IConnectionFactory? ConnectionFactory { get; set; } public System.Uri? ConnectionUri { get; set; } + public System.TimeSpan? RequestedConnectionTimeout { get; set; } public RabbitMQ.Client.SslOption? Ssl { get; set; } } }