Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
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);
            }
        }
Exemplo n.º 3
0
 private void RequestTimeout(RequestResponseSequence seq)
 {
     RemoveExchange(seq.key);
     if (log.IsWarnEnabled)
     {
         log.Warn("TokenLayer - Request/Response exchange timed out: " + seq.key);
     }
     seq.request.HandleTimeout();
 }
Exemplo n.º 4
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);
             }
         }
     }
 }