mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-25 15:42:57 +08:00
Merge pull request #826 from fogzot/develop-iretainedmesagesmanager
Added IMqttRetainedMessagesManager
This commit is contained in:
@@ -0,0 +1,21 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MQTTnet.Exceptions
|
||||||
|
{
|
||||||
|
public class MqttConfigurationException : Exception
|
||||||
|
{
|
||||||
|
protected MqttConfigurationException()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public MqttConfigurationException(Exception innerException)
|
||||||
|
: base(innerException.Message, innerException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public MqttConfigurationException(string message)
|
||||||
|
: base(message)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using MQTTnet.Diagnostics;
|
||||||
|
|
||||||
|
namespace MQTTnet.Server
|
||||||
|
{
|
||||||
|
public interface IMqttRetainedMessagesManager
|
||||||
|
{
|
||||||
|
Task Start(IMqttServerOptions options, IMqttNetChildLogger logger);
|
||||||
|
|
||||||
|
Task LoadMessagesAsync();
|
||||||
|
|
||||||
|
Task ClearMessagesAsync();
|
||||||
|
|
||||||
|
Task HandleMessageAsync(string clientId, MqttApplicationMessage applicationMessage);
|
||||||
|
|
||||||
|
Task<IList<MqttApplicationMessage>> GetMessagesAsync();
|
||||||
|
|
||||||
|
Task<IList<MqttApplicationMessage>> GetSubscribedMessagesAsync(ICollection<TopicFilter> topicFilters);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,6 +24,6 @@ namespace MQTTnet.Server
|
|||||||
|
|
||||||
IMqttServerStorage Storage { get; }
|
IMqttServerStorage Storage { get; }
|
||||||
|
|
||||||
|
IMqttRetainedMessagesManager RetainedMessagesManager { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,7 +21,7 @@ namespace MQTTnet.Server
|
|||||||
private readonly MqttPacketDispatcher _packetDispatcher = new MqttPacketDispatcher();
|
private readonly MqttPacketDispatcher _packetDispatcher = new MqttPacketDispatcher();
|
||||||
private readonly CancellationTokenSource _cancellationToken = new CancellationTokenSource();
|
private readonly CancellationTokenSource _cancellationToken = new CancellationTokenSource();
|
||||||
|
|
||||||
private readonly MqttRetainedMessagesManager _retainedMessagesManager;
|
private readonly IMqttRetainedMessagesManager _retainedMessagesManager;
|
||||||
private readonly MqttClientKeepAliveMonitor _keepAliveMonitor;
|
private readonly MqttClientKeepAliveMonitor _keepAliveMonitor;
|
||||||
private readonly MqttClientSessionsManager _sessionsManager;
|
private readonly MqttClientSessionsManager _sessionsManager;
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ namespace MQTTnet.Server
|
|||||||
MqttClientSession session,
|
MqttClientSession session,
|
||||||
IMqttServerOptions serverOptions,
|
IMqttServerOptions serverOptions,
|
||||||
MqttClientSessionsManager sessionsManager,
|
MqttClientSessionsManager sessionsManager,
|
||||||
MqttRetainedMessagesManager retainedMessagesManager,
|
IMqttRetainedMessagesManager retainedMessagesManager,
|
||||||
IMqttNetChildLogger logger)
|
IMqttNetChildLogger logger)
|
||||||
{
|
{
|
||||||
Session = session ?? throw new ArgumentNullException(nameof(session));
|
Session = session ?? throw new ArgumentNullException(nameof(session));
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ namespace MQTTnet.Server
|
|||||||
ApplicationMessagesQueue.Enqueue(applicationMessage, senderClientId, checkSubscriptionsResult.QualityOfServiceLevel, isRetainedApplicationMessage);
|
ApplicationMessagesQueue.Enqueue(applicationMessage, senderClientId, checkSubscriptionsResult.QualityOfServiceLevel, isRetainedApplicationMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SubscribeAsync(ICollection<TopicFilter> topicFilters, MqttRetainedMessagesManager retainedMessagesManager)
|
public async Task SubscribeAsync(ICollection<TopicFilter> topicFilters, IMqttRetainedMessagesManager retainedMessagesManager)
|
||||||
{
|
{
|
||||||
await SubscriptionsManager.SubscribeAsync(topicFilters).ConfigureAwait(false);
|
await SubscriptionsManager.SubscribeAsync(topicFilters).ConfigureAwait(false);
|
||||||
|
|
||||||
|
|||||||
@@ -25,13 +25,13 @@ namespace MQTTnet.Server
|
|||||||
private readonly CancellationToken _cancellationToken;
|
private readonly CancellationToken _cancellationToken;
|
||||||
private readonly MqttServerEventDispatcher _eventDispatcher;
|
private readonly MqttServerEventDispatcher _eventDispatcher;
|
||||||
|
|
||||||
private readonly MqttRetainedMessagesManager _retainedMessagesManager;
|
private readonly IMqttRetainedMessagesManager _retainedMessagesManager;
|
||||||
private readonly IMqttServerOptions _options;
|
private readonly IMqttServerOptions _options;
|
||||||
private readonly IMqttNetChildLogger _logger;
|
private readonly IMqttNetChildLogger _logger;
|
||||||
|
|
||||||
public MqttClientSessionsManager(
|
public MqttClientSessionsManager(
|
||||||
IMqttServerOptions options,
|
IMqttServerOptions options,
|
||||||
MqttRetainedMessagesManager retainedMessagesManager,
|
IMqttRetainedMessagesManager retainedMessagesManager,
|
||||||
CancellationToken cancellationToken,
|
CancellationToken cancellationToken,
|
||||||
MqttServerEventDispatcher eventDispatcher,
|
MqttServerEventDispatcher eventDispatcher,
|
||||||
IMqttNetChildLogger logger)
|
IMqttNetChildLogger logger)
|
||||||
|
|||||||
@@ -7,20 +7,21 @@ using MQTTnet.Internal;
|
|||||||
|
|
||||||
namespace MQTTnet.Server
|
namespace MQTTnet.Server
|
||||||
{
|
{
|
||||||
public class MqttRetainedMessagesManager
|
public class MqttRetainedMessagesManager : IMqttRetainedMessagesManager
|
||||||
{
|
{
|
||||||
private readonly byte[] _emptyArray = new byte[0];
|
private readonly byte[] _emptyArray = new byte[0];
|
||||||
private readonly AsyncLock _messagesLock = new AsyncLock();
|
private readonly AsyncLock _messagesLock = new AsyncLock();
|
||||||
private readonly Dictionary<string, MqttApplicationMessage> _messages = new Dictionary<string, MqttApplicationMessage>();
|
private readonly Dictionary<string, MqttApplicationMessage> _messages = new Dictionary<string, MqttApplicationMessage>();
|
||||||
|
|
||||||
private readonly IMqttNetChildLogger _logger;
|
private IMqttNetChildLogger _logger;
|
||||||
private readonly IMqttServerOptions _options;
|
private IMqttServerOptions _options;
|
||||||
|
|
||||||
public MqttRetainedMessagesManager(IMqttServerOptions options, IMqttNetChildLogger logger)
|
public Task Start(IMqttServerOptions options, IMqttNetChildLogger logger)
|
||||||
{
|
{
|
||||||
if (logger == null) throw new ArgumentNullException(nameof(logger));
|
if (logger == null) throw new ArgumentNullException(nameof(logger));
|
||||||
_logger = logger.CreateChildLogger(nameof(MqttRetainedMessagesManager));
|
_logger = logger.CreateChildLogger(nameof(MqttRetainedMessagesManager));
|
||||||
_options = options ?? throw new ArgumentNullException(nameof(options));
|
_options = options ?? throw new ArgumentNullException(nameof(options));
|
||||||
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task LoadMessagesAsync()
|
public async Task LoadMessagesAsync()
|
||||||
@@ -103,7 +104,7 @@ namespace MQTTnet.Server
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<MqttApplicationMessage>> GetSubscribedMessagesAsync(ICollection<TopicFilter> topicFilters)
|
public async Task<IList<MqttApplicationMessage>> GetSubscribedMessagesAsync(ICollection<TopicFilter> topicFilters)
|
||||||
{
|
{
|
||||||
if (topicFilters == null) throw new ArgumentNullException(nameof(topicFilters));
|
if (topicFilters == null) throw new ArgumentNullException(nameof(topicFilters));
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ using MQTTnet.Adapter;
|
|||||||
using MQTTnet.Client.Publishing;
|
using MQTTnet.Client.Publishing;
|
||||||
using MQTTnet.Client.Receiving;
|
using MQTTnet.Client.Receiving;
|
||||||
using MQTTnet.Diagnostics;
|
using MQTTnet.Diagnostics;
|
||||||
|
using MQTTnet.Exceptions;
|
||||||
using MQTTnet.Protocol;
|
using MQTTnet.Protocol;
|
||||||
using MQTTnet.Server.Status;
|
using MQTTnet.Server.Status;
|
||||||
|
|
||||||
@@ -19,7 +20,7 @@ namespace MQTTnet.Server
|
|||||||
private readonly IMqttNetChildLogger _logger;
|
private readonly IMqttNetChildLogger _logger;
|
||||||
|
|
||||||
private MqttClientSessionsManager _clientSessionsManager;
|
private MqttClientSessionsManager _clientSessionsManager;
|
||||||
private MqttRetainedMessagesManager _retainedMessagesManager;
|
private IMqttRetainedMessagesManager _retainedMessagesManager;
|
||||||
private CancellationTokenSource _cancellationTokenSource;
|
private CancellationTokenSource _cancellationTokenSource;
|
||||||
|
|
||||||
public MqttServer(IEnumerable<IMqttServerAdapter> adapters, IMqttNetChildLogger logger)
|
public MqttServer(IEnumerable<IMqttServerAdapter> adapters, IMqttNetChildLogger logger)
|
||||||
@@ -117,11 +118,14 @@ namespace MQTTnet.Server
|
|||||||
{
|
{
|
||||||
Options = options ?? throw new ArgumentNullException(nameof(options));
|
Options = options ?? throw new ArgumentNullException(nameof(options));
|
||||||
|
|
||||||
|
if (Options.RetainedMessagesManager == null) throw new MqttConfigurationException("options.RetainedMessagesManager should not be null.");
|
||||||
|
|
||||||
if (_cancellationTokenSource != null) throw new InvalidOperationException("The server is already started.");
|
if (_cancellationTokenSource != null) throw new InvalidOperationException("The server is already started.");
|
||||||
|
|
||||||
_cancellationTokenSource = new CancellationTokenSource();
|
_cancellationTokenSource = new CancellationTokenSource();
|
||||||
|
|
||||||
_retainedMessagesManager = new MqttRetainedMessagesManager(Options, _logger);
|
_retainedMessagesManager = Options.RetainedMessagesManager;
|
||||||
|
await _retainedMessagesManager.Start(Options, _logger);
|
||||||
await _retainedMessagesManager.LoadMessagesAsync().ConfigureAwait(false);
|
await _retainedMessagesManager.LoadMessagesAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
_clientSessionsManager = new MqttClientSessionsManager(Options, _retainedMessagesManager, _cancellationTokenSource.Token, _eventDispatcher, _logger);
|
_clientSessionsManager = new MqttClientSessionsManager(Options, _retainedMessagesManager, _cancellationTokenSource.Token, _eventDispatcher, _logger);
|
||||||
|
|||||||
@@ -29,5 +29,7 @@ namespace MQTTnet.Server
|
|||||||
public IMqttServerUnsubscriptionInterceptor UnsubscriptionInterceptor { get; set; }
|
public IMqttServerUnsubscriptionInterceptor UnsubscriptionInterceptor { get; set; }
|
||||||
|
|
||||||
public IMqttServerStorage Storage { get; set; }
|
public IMqttServerStorage Storage { get; set; }
|
||||||
|
|
||||||
|
public IMqttRetainedMessagesManager RetainedMessagesManager { get; set; } = new MqttRetainedMessagesManager();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,6 +125,12 @@ namespace MQTTnet.Server
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MqttServerOptionsBuilder WithRetainedMessagesManager(IMqttRetainedMessagesManager value)
|
||||||
|
{
|
||||||
|
_options.RetainedMessagesManager = value;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public MqttServerOptionsBuilder WithConnectionValidator(IMqttServerConnectionValidator value)
|
public MqttServerOptionsBuilder WithConnectionValidator(IMqttServerConnectionValidator value)
|
||||||
{
|
{
|
||||||
_options.ConnectionValidator = value;
|
_options.ConnectionValidator = value;
|
||||||
|
|||||||
Reference in New Issue
Block a user