@@ -18,6 +18,7 @@ namespace MQTTnet.Server
18
18
public sealed class MqttSession : IDisposable
19
19
{
20
20
readonly MqttClientSessionsManager _clientSessionsManager ;
21
+ readonly MqttServerEventContainer _eventContainer ;
21
22
readonly MqttPacketBus _packetBus = new MqttPacketBus ( ) ;
22
23
readonly MqttPacketIdentifierProvider _packetIdentifierProvider = new MqttPacketIdentifierProvider ( ) ;
23
24
@@ -44,6 +45,7 @@ public MqttSession(
44
45
_connectPacket = connectPacket ?? throw new ArgumentNullException ( nameof ( connectPacket ) ) ;
45
46
_serverOptions = serverOptions ?? throw new ArgumentNullException ( nameof ( serverOptions ) ) ;
46
47
_clientSessionsManager = clientSessionsManager ?? throw new ArgumentNullException ( nameof ( clientSessionsManager ) ) ;
48
+ _eventContainer = eventContainer ?? throw new ArgumentNullException ( nameof ( eventContainer ) ) ;
47
49
48
50
_subscriptionsManager = new MqttClientSubscriptionsManager ( this , eventContainer , retainedMessagesManager , clientSessionsManager ) ;
49
51
}
@@ -117,20 +119,25 @@ public void EnqueueControlPacket(MqttPacketBusItem packetBusItem)
117
119
_packetBus . EnqueueItem ( packetBusItem , MqttPacketBusPartition . Control ) ;
118
120
}
119
121
120
- public void EnqueueDataPacket ( MqttPacketBusItem packetBusItem )
122
+ public EnqueueDataPacketResult EnqueueDataPacket ( MqttPacketBusItem packetBusItem )
121
123
{
122
124
if ( _packetBus . ItemsCount ( MqttPacketBusPartition . Data ) >= _serverOptions . MaxPendingMessagesPerClient )
123
125
{
124
126
if ( _serverOptions . PendingMessagesOverflowStrategy == MqttPendingMessagesOverflowStrategy . DropNewMessage )
125
127
{
126
- return ;
128
+ return EnqueueDataPacketResult . Dropped ;
127
129
}
128
130
129
131
if ( _serverOptions . PendingMessagesOverflowStrategy == MqttPendingMessagesOverflowStrategy . DropOldestQueuedMessage )
130
132
{
131
133
// Only drop from the data partition. Dropping from control partition might break the connection
132
134
// because the client does not receive PINGREQ packets etc. any longer.
133
- _packetBus . DropFirstItem ( MqttPacketBusPartition . Data ) ;
135
+ var firstItem = _packetBus . DropFirstItem ( MqttPacketBusPartition . Data ) ;
136
+ if ( firstItem != null && _eventContainer . QueuedApplicationMessageOverwrittenEvent . HasHandlers )
137
+ {
138
+ var eventArgs = new QueueMessageOverwrittenEventArgs ( Id , firstItem . Packet ) ;
139
+ _eventContainer . QueuedApplicationMessageOverwrittenEvent . InvokeAsync ( eventArgs ) . ConfigureAwait ( false ) ;
140
+ }
134
141
}
135
142
}
136
143
@@ -147,6 +154,7 @@ public void EnqueueDataPacket(MqttPacketBusItem packetBusItem)
147
154
}
148
155
149
156
_packetBus . EnqueueItem ( packetBusItem , MqttPacketBusPartition . Data ) ;
157
+ return EnqueueDataPacketResult . Enqueued ;
150
158
}
151
159
152
160
public void EnqueueHealthPacket ( MqttPacketBusItem packetBusItem )
0 commit comments