예제 #1
0
        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);
            }
        }
예제 #2
0
 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);
             }
         }
     }
 }