Refactor logging. Remove TCP adapter from HTTP host if disabled.

This commit is contained in:
Christian
2018-05-13 20:18:08 +02:00
parent 8df8cb1eb6
commit dc7b9414d9
13 changed files with 41 additions and 38 deletions
+1
View File
@@ -11,6 +11,7 @@
<requireLicenseAcceptance>false</requireLicenseAcceptance> <requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker).</description> <description>MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker).</description>
<releaseNotes> * [Core] Performance optimizations. <releaseNotes> * [Core] Performance optimizations.
* [Core] Due to performance reasons the timestamp of log messages is now in UTC format.
* [Client] Received messages are now processed in the worker thread by default. Added a new setting for switching back to dedicated threads. * [Client] Received messages are now processed in the worker thread by default. Added a new setting for switching back to dedicated threads.
* [Server] Added support for other WebSocket sub protocol formats like mqttv-3.1.1 (thanks to @israellot). * [Server] Added support for other WebSocket sub protocol formats like mqttv-3.1.1 (thanks to @israellot).
* [Server] The takeover of an existing client sessions is now treated as a _clean_ disconnect of the previous client. * [Server] The takeover of an existing client sessions is now treated as a _clean_ disconnect of the previous client.
@@ -25,6 +25,11 @@ namespace MQTTnet.AspNetCore
.FirstOrDefault(p => p.ToLower().StartsWith("mqtt")); .FirstOrDefault(p => p.ToLower().StartsWith("mqtt"));
} }
if (subprotocol == null)
{
return;
}
var adapter = app.ApplicationServices.GetRequiredService<MqttWebSocketServerAdapter>(); var adapter = app.ApplicationServices.GetRequiredService<MqttWebSocketServerAdapter>();
using (var webSocket = await context.WebSockets.AcceptWebSocketAsync(subprotocol)) using (var webSocket = await context.WebSockets.AcceptWebSocketAsync(subprotocol))
{ {
@@ -31,12 +31,12 @@ namespace MQTTnet.AspNetCore
var eventArgs = new MqttServerAdapterClientAcceptedEventArgs(clientAdapter); var eventArgs = new MqttServerAdapterClientAcceptedEventArgs(clientAdapter);
ClientAccepted?.Invoke(this, eventArgs); ClientAccepted?.Invoke(this, eventArgs);
return eventArgs.SessionTask; return eventArgs.SessionTask ?? Task.CompletedTask;
} }
public void Dispose() public void Dispose()
{ {
StopAsync(); StopAsync().GetAwaiter().GetResult();
} }
} }
} }
@@ -14,16 +14,24 @@ namespace MQTTnet.AspNetCore
{ {
if (options == null) throw new ArgumentNullException(nameof(options)); if (options == null) throw new ArgumentNullException(nameof(options));
var logger = new MqttNetLogger();
var childLogger = logger.CreateChildLogger();
services.AddSingleton(options); services.AddSingleton(options);
services.AddSingleton<IMqttNetLogger>(new MqttNetLogger()); services.AddSingleton<IMqttNetLogger>(logger);
services.AddSingleton(childLogger);
services.AddSingleton<MqttHostedServer>(); services.AddSingleton<MqttHostedServer>();
services.AddSingleton<IHostedService>(s => s.GetService<MqttHostedServer>()); services.AddSingleton<IHostedService>(s => s.GetService<MqttHostedServer>());
services.AddSingleton<IMqttServer>(s => s.GetService<MqttHostedServer>()); services.AddSingleton<IMqttServer>(s => s.GetService<MqttHostedServer>());
services.AddSingleton<MqttWebSocketServerAdapter>(); services.AddSingleton<MqttWebSocketServerAdapter>();
services.AddSingleton<MqttTcpServerAdapter>(); services.AddSingleton<MqttTcpServerAdapter>();
services.AddSingleton<IMqttServerAdapter>(s => s.GetService<MqttWebSocketServerAdapter>()); services.AddSingleton<IMqttServerAdapter>(s => s.GetService<MqttWebSocketServerAdapter>());
services.AddSingleton<IMqttServerAdapter>(s => s.GetService<MqttTcpServerAdapter>());
if (options.DefaultEndpointOptions.IsEnabled)
{
services.AddSingleton<IMqttServerAdapter>(s => s.GetService<MqttTcpServerAdapter>());
}
return services; return services;
} }
@@ -504,20 +504,16 @@ namespace MQTTnet.Client
private void StartReceivingPackets(CancellationToken cancellationToken) private void StartReceivingPackets(CancellationToken cancellationToken)
{ {
_packetReceiverTask = Task.Factory.StartNew( _packetReceiverTask = Task.Run(
() => ReceivePacketsAsync(cancellationToken), () => ReceivePacketsAsync(cancellationToken),
cancellationToken, cancellationToken);
TaskCreationOptions.LongRunning,
TaskScheduler.Current);
} }
private void StartSendingKeepAliveMessages(CancellationToken cancellationToken) private void StartSendingKeepAliveMessages(CancellationToken cancellationToken)
{ {
_keepAliveMessageSenderTask = Task.Factory.StartNew( _keepAliveMessageSenderTask = Task.Run(
() => SendKeepAliveMessagesAsync(cancellationToken), () => SendKeepAliveMessagesAsync(cancellationToken),
cancellationToken, cancellationToken);
TaskCreationOptions.LongRunning,
TaskScheduler.Current);
} }
private void StartProcessReceivedPacketAsync(MqttBasePacket packet, CancellationToken cancellationToken) private void StartProcessReceivedPacketAsync(MqttBasePacket packet, CancellationToken cancellationToken)
@@ -4,7 +4,7 @@ namespace MQTTnet.Diagnostics
{ {
public interface IMqttNetChildLogger public interface IMqttNetChildLogger
{ {
IMqttNetChildLogger CreateChildLogger(string source); IMqttNetChildLogger CreateChildLogger(string source = null);
void Verbose(string message, params object[] parameters); void Verbose(string message, params object[] parameters);
@@ -6,7 +6,7 @@ namespace MQTTnet.Diagnostics
{ {
event EventHandler<MqttNetLogMessagePublishedEventArgs> LogMessagePublished; event EventHandler<MqttNetLogMessagePublishedEventArgs> LogMessagePublished;
IMqttNetChildLogger CreateChildLogger(string source); IMqttNetChildLogger CreateChildLogger(string source = null);
void Publish(MqttNetLogLevel logLevel, string source, string message, object[] parameters, Exception exception); void Publish(MqttNetLogLevel logLevel, string source, string message, object[] parameters, Exception exception);
} }
@@ -13,7 +13,7 @@ namespace MQTTnet.Diagnostics
public event EventHandler<MqttNetLogMessagePublishedEventArgs> LogMessagePublished; public event EventHandler<MqttNetLogMessagePublishedEventArgs> LogMessagePublished;
public IMqttNetChildLogger CreateChildLogger(string source) public IMqttNetChildLogger CreateChildLogger(string source = null)
{ {
return new MqttNetChildLogger(this, source); return new MqttNetChildLogger(this, source);
} }
@@ -45,11 +45,8 @@ namespace MQTTnet.Implementations
_defaultEndpointSocket.Bind(new IPEndPoint(options.DefaultEndpointOptions.BoundIPAddress, options.GetDefaultEndpointPort())); _defaultEndpointSocket.Bind(new IPEndPoint(options.DefaultEndpointOptions.BoundIPAddress, options.GetDefaultEndpointPort()));
_defaultEndpointSocket.Listen(options.ConnectionBacklog); _defaultEndpointSocket.Listen(options.ConnectionBacklog);
Task.Factory.StartNew( Task.Run(() => AcceptDefaultEndpointConnectionsAsync(_cancellationTokenSource.Token),
() => AcceptDefaultEndpointConnectionsAsync(_cancellationTokenSource.Token), _cancellationTokenSource.Token);
_cancellationTokenSource.Token,
TaskCreationOptions.LongRunning,
TaskScheduler.Current);
} }
if (options.TlsEndpointOptions.IsEnabled) if (options.TlsEndpointOptions.IsEnabled)
@@ -69,11 +66,9 @@ namespace MQTTnet.Implementations
_tlsEndpointSocket.Bind(new IPEndPoint(options.TlsEndpointOptions.BoundIPAddress, options.GetTlsEndpointPort())); _tlsEndpointSocket.Bind(new IPEndPoint(options.TlsEndpointOptions.BoundIPAddress, options.GetTlsEndpointPort()));
_tlsEndpointSocket.Listen(options.ConnectionBacklog); _tlsEndpointSocket.Listen(options.ConnectionBacklog);
Task.Factory.StartNew( Task.Run(
() => AcceptTlsEndpointConnectionsAsync(_cancellationTokenSource.Token), () => AcceptTlsEndpointConnectionsAsync(_cancellationTokenSource.Token),
_cancellationTokenSource.Token, _cancellationTokenSource.Token);
TaskCreationOptions.LongRunning,
TaskScheduler.Current);
} }
return Task.FromResult(0); return Task.FromResult(0);
@@ -25,14 +25,14 @@ namespace MQTTnet
public IManagedMqttClient CreateManagedMqttClient() public IManagedMqttClient CreateManagedMqttClient()
{ {
return new ManagedMqttClient(CreateMqttClient(), new MqttNetLogger().CreateChildLogger(string.Empty)); return new ManagedMqttClient(CreateMqttClient(), new MqttNetLogger().CreateChildLogger());
} }
public IManagedMqttClient CreateManagedMqttClient(IMqttNetLogger logger) public IManagedMqttClient CreateManagedMqttClient(IMqttNetLogger logger)
{ {
if (logger == null) throw new ArgumentNullException(nameof(logger)); if (logger == null) throw new ArgumentNullException(nameof(logger));
return new ManagedMqttClient(CreateMqttClient(), logger.CreateChildLogger(string.Empty)); return new ManagedMqttClient(CreateMqttClient(), logger.CreateChildLogger());
} }
public IMqttServer CreateMqttServer() public IMqttServer CreateMqttServer()
@@ -45,7 +45,7 @@ namespace MQTTnet
{ {
if (logger == null) throw new ArgumentNullException(nameof(logger)); if (logger == null) throw new ArgumentNullException(nameof(logger));
return CreateMqttServer(new List<IMqttServerAdapter> { new MqttTcpServerAdapter(logger.CreateChildLogger(string.Empty)) }, logger); return CreateMqttServer(new List<IMqttServerAdapter> { new MqttTcpServerAdapter(logger.CreateChildLogger()) }, logger);
} }
public IMqttServer CreateMqttServer(IEnumerable<IMqttServerAdapter> adapters, IMqttNetLogger logger) public IMqttServer CreateMqttServer(IEnumerable<IMqttServerAdapter> adapters, IMqttNetLogger logger)
@@ -53,7 +53,7 @@ namespace MQTTnet
if (adapters == null) throw new ArgumentNullException(nameof(adapters)); if (adapters == null) throw new ArgumentNullException(nameof(adapters));
if (logger == null) throw new ArgumentNullException(nameof(logger)); if (logger == null) throw new ArgumentNullException(nameof(logger));
return new MqttServer(adapters, logger.CreateChildLogger(string.Empty)); return new MqttServer(adapters, logger.CreateChildLogger());
} }
} }
} }
@@ -157,11 +157,9 @@ namespace MQTTnet.Server
private void OnClientAccepted(object sender, MqttServerAdapterClientAcceptedEventArgs eventArgs) private void OnClientAccepted(object sender, MqttServerAdapterClientAcceptedEventArgs eventArgs)
{ {
eventArgs.SessionTask = Task.Factory.StartNew( eventArgs.SessionTask = Task.Run(
() => _clientSessionsManager.RunSessionAsync(eventArgs.Client, _cancellationTokenSource.Token), () => _clientSessionsManager.RunSessionAsync(eventArgs.Client, _cancellationTokenSource.Token),
_cancellationTokenSource.Token, _cancellationTokenSource.Token);
TaskCreationOptions.LongRunning,
TaskScheduler.Current);
} }
} }
} }
@@ -10,7 +10,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.5" /> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.8" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -17,8 +17,8 @@ namespace MQTTnet.TestApp.NetCore
Console.WriteLine("Press 'c' for concurrent sends. Otherwise in one batch."); Console.WriteLine("Press 'c' for concurrent sends. Otherwise in one batch.");
var concurrent = Console.ReadKey(true).KeyChar == 'c'; var concurrent = Console.ReadKey(true).KeyChar == 'c';
var server = Task.Factory.StartNew(async () => await RunServerAsync(), TaskCreationOptions.LongRunning); var server = Task.Run(RunServerAsync);
var client = Task.Factory.StartNew(async () => await RunClientAsync(2000, TimeSpan.FromMilliseconds(10), concurrent), TaskCreationOptions.LongRunning); var client = Task.Run(() => RunClientAsync(2000, TimeSpan.FromMilliseconds(10), concurrent));
await Task.WhenAll(server, client).ConfigureAwait(false); await Task.WhenAll(server, client).ConfigureAwait(false);
} }