예제 #1
0
 public void Dispose()
 {
     WrappedSocketsMap.Clear();
     IdentitySocketsMap.Clear();
     IdentityConnectionSocketsMap.Clear();
     StoredResponses.Clear();
     StopProtocolJobs();
     socket?.Dispose();
     socket = null;
 }
예제 #2
0
        private void HandleDisconnect(PairSocket remotePair)
        {
            if (remotePair.LastWill != null)
            {
                ProtocolHandler.HandleMessage(this, remotePair, remotePair.LastWill);
            }


            //Remove subscribers do cliente caso não seja do tipo Persistent
            List <PubSubQueue> queuesByPair;

            if (SubscriberSockets.TryGetValue(remotePair, out queuesByPair))
            {
                for (var i = 0; i < queuesByPair.Count; i++)
                {
                    var queue = queuesByPair[i];
                    queue.RemoveSubscriber(remotePair, false);
                    if (queue.CanDispose)
                    {
                        Queue.Remove(queue.Name);
                    }
                }
            }

            //Caso seja um cliente, libera os recursos alocados por ele
            if (remotePair != this)
            {
                WrappedSocketsMap.Remove(remotePair.Socket);
                IdentityConnectionSocketsMap.Remove(remotePair);
                remotePair.Dispose();
            }

            remotePair.Close();

            OnClientDisconnect?.Invoke(remotePair);
        }