private RequestResponseSequence AddExchange(Request request) { // be aware when manually setting tokens, as request/response will be replace RemoveExchange(request.SequenceKey); RequestResponseSequence sequence = new RequestResponseSequence(); sequence.key = request.SequenceKey; sequence.request = request; sequence.timeoutHandler = RequestTimeout; lock (_exchanges) { _exchanges[sequence.key] = sequence; } if (_sequenceTimeout >= 0) { sequence.Start(_sequenceTimeout); } if (log.IsDebugEnabled) { log.Debug("TokenLayer - Stored new exchange: " + sequence.key); } return(sequence); }
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 RequestTimeout(RequestResponseSequence seq) { RemoveExchange(seq.key); if (log.IsWarnEnabled) { log.Warn("TokenLayer - Request/Response exchange timed out: " + seq.key); } seq.request.HandleTimeout(); }
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); } } } }