From e18a91a4b59bc312aa9acf9be575401d07b793e4 Mon Sep 17 00:00:00 2001 From: pigwing <35950090@qq.com> Date: Sat, 22 Jun 2024 21:24:25 +0800 Subject: [PATCH] fix LoadingRetainedMessageAsync not exec (#2025) because IHostedService StartAsync before startup Configure see https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-8.0#ihostapplicationlifetime --- Source/MQTTnet.AspnetCore/MqttHostedServer.cs | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/Source/MQTTnet.AspnetCore/MqttHostedServer.cs b/Source/MQTTnet.AspnetCore/MqttHostedServer.cs index c6c64ffd..b34adc3d 100644 --- a/Source/MQTTnet.AspnetCore/MqttHostedServer.cs +++ b/Source/MQTTnet.AspnetCore/MqttHostedServer.cs @@ -16,26 +16,51 @@ namespace MQTTnet.AspNetCore public sealed class MqttHostedServer : MqttServer, IHostedService { readonly MqttFactory _mqttFactory; - - public MqttHostedServer(MqttFactory mqttFactory, MqttServerOptions options, IEnumerable adapters, IMqttNetLogger logger) : base( +#if NETCOREAPP3_1_OR_GREATER + readonly IHostApplicationLifetime _hostApplicationLifetime; + public MqttHostedServer(IHostApplicationLifetime hostApplicationLifetime, MqttFactory mqttFactory, + MqttServerOptions options, IEnumerable adapters, IMqttNetLogger logger) : base( + options, + adapters, + logger) + { + _mqttFactory = mqttFactory ?? throw new ArgumentNullException(nameof(mqttFactory)); + _hostApplicationLifetime = hostApplicationLifetime; + } +#else + public MqttHostedServer(MqttFactory mqttFactory, + MqttServerOptions options, IEnumerable adapters, IMqttNetLogger logger) : base( options, adapters, logger) { _mqttFactory = mqttFactory ?? throw new ArgumentNullException(nameof(mqttFactory)); } +#endif + public async Task StartAsync(CancellationToken cancellationToken) { // The yield makes sure that the hosted service is considered up and running. await Task.Yield(); - +#if NETCOREAPP3_1_OR_GREATER + _hostApplicationLifetime.ApplicationStarted.Register(OnStarted); +#else _ = StartAsync(); +#endif + } public Task StopAsync(CancellationToken cancellationToken) { return StopAsync(_mqttFactory.CreateMqttServerStopOptionsBuilder().Build()); } + +#if NETCOREAPP3_1_OR_GREATER + private void OnStarted() + { + _ = StartAsync(); + } +#endif } } \ No newline at end of file