protected override void DoReceiveMessage(Message msg) { if (msg is Response) { Response response = (Response)msg; RequestResponseSequence sequence = GetExchange(msg.SequenceKey); if (sequence == null && response.Token.Length == 0) { if (log.IsWarnEnabled) { log.Warn("TokenLayer - Remote endpoint failed to echo token: " + msg.Key); } // TODO try to recover from peerAddress // let timeout handle the problem return; } else if (sequence != null) { if (!msg.IsEmptyACK) { sequence.Cancel(); // TODO separate observe registry if (msg.GetFirstOption(OptionType.Observe) == null) { RemoveExchange(msg.SequenceKey); } } if (log.IsDebugEnabled) { log.Debug(String.Format("TokenLayer - Incoming response from {0}: {1} // RTT: {2}ms", ((Response)msg).Request.UriPath, msg.SequenceKey, ((Response)msg).RTT)); } DeliverMessage(msg); } else { if (log.IsWarnEnabled) { log.Warn("TokenLayer - Dropping unexpected response: " + response.SequenceKey); } } } else if (msg is Request) { if (log.IsDebugEnabled) { log.Debug("TokenLayer - Incoming request: " + msg.SequenceKey); } DeliverMessage(msg); } }
private void RemoveExchange(String key) { lock (_exchanges) { if (_exchanges.ContainsKey(key)) { RequestResponseSequence exchange = _exchanges[key]; _exchanges.Remove(key); exchange.Cancel(); TokenManager.Instance.ReleaseToken(exchange.request.Token); if (log.IsDebugEnabled) { log.Debug("TokenLayer - Cleared exchange: " + exchange.key); } } } }