示例#1
0
        public async Task OnConnectionBlocked(ConnectionBlockedEventArgs args)
        {
            AsyncEventHandler <ConnectionBlockedEventArgs> handler;

            lock (m_eventLock)
            {
                handler = m_connectionBlocked;
            }
            if (handler != null)
            {
                foreach (AsyncEventHandler <ConnectionBlockedEventArgs> h in handler.GetInvocationList())
                {
                    try
                    {
                        await h(this, args);
                    }
                    catch (Exception e)
                    {
                        await OnCallbackException(CallbackExceptionEventArgs.Build(e,
                                                                                   new Dictionary <string, object>
                        {
                            { "context", "OnConnectionBlocked" }
                        }));
                    }
                }
            }
        }
示例#2
0
 protected override async Task Execute(ModelBase model, IAsyncBasicConsumer consumer)
 {
     try
     {
         await consumer.HandleBasicDeliver(_consumerTag,
                                           _deliveryTag,
                                           _redelivered,
                                           _exchange,
                                           _routingKey,
                                           _basicProperties,
                                           _body).ConfigureAwait(false);
     }
     catch (Exception e)
     {
         var details = new Dictionary <string, object>()
         {
             { "consumer", consumer },
             { "context", "HandleBasicDeliver" }
         };
         model.OnCallbackException(CallbackExceptionEventArgs.Build(e, details));
     }
     finally
     {
         if (MemoryMarshal.TryGetArray(_body, out ArraySegment <byte> segment))
         {
             ArrayPool <byte> .Shared.Return(segment.Array);
         }
     }
 }
示例#3
0
            private static async Task HandleConcurrent(Work work, IModel model, SemaphoreSlim limiter)
            {
                try
                {
                    Task task = work.Execute();
                    if (!task.IsCompleted)
                    {
                        await task.ConfigureAwait(false);
                    }
                }
                catch (Exception e)
                {
                    if (!(model is ModelBase modelBase))
                    {
                        return;
                    }

                    var details = new Dictionary <string, object>
                    {
                        { "consumer", work.Consumer },
                        { "context", work.Consumer }
                    };
                    modelBase.OnCallbackException(CallbackExceptionEventArgs.Build(e, details));
                }
                finally
                {
                    work.PostExecute();
                    limiter.Release();
                }
            }
 protected override async Task ProcessChannelAsync()
 {
     while (await _reader.WaitToReadAsync().ConfigureAwait(false))
     {
         while (_reader.TryRead(out var work))
         {
             try
             {
                 var task = work.WorkType switch
                 {
                     WorkType.Deliver => work.AsyncConsumer.HandleBasicDeliver(work.ConsumerTag, work.DeliveryTag, work.Redelivered, work.Exchange, work.RoutingKey, work.BasicProperties, work.Body),
                     WorkType.Cancel => work.AsyncConsumer.HandleBasicCancel(work.ConsumerTag),
                     WorkType.CancelOk => work.AsyncConsumer.HandleBasicCancelOk(work.ConsumerTag),
                     WorkType.ConsumeOk => work.AsyncConsumer.HandleBasicConsumeOk(work.ConsumerTag),
                     WorkType.Shutdown => work.AsyncConsumer.HandleModelShutdown(_model, work.Reason),
                     _ => Task.CompletedTask
                 };
                 await task.ConfigureAwait(false);
             }
             catch (Exception e)
             {
                 _model.OnCallbackException(CallbackExceptionEventArgs.Build(e, work.WorkType.ToString(), work.Consumer));
             }
             finally
             {
                 if (work.RentedArray != null)
                 {
                     ArrayPool <byte> .Shared.Return(work.RentedArray);
                 }
             }
         }
     }
 }
示例#5
0
            private async Task Loop()
            {
                while (await _channel.Reader.WaitToReadAsync().ConfigureAwait(false))
                {
                    while (_channel.Reader.TryRead(out Work work))
                    {
                        try
                        {
                            Task task = work.Execute();
                            if (!task.IsCompleted)
                            {
                                await task.ConfigureAwait(false);
                            }
                        }
                        catch (Exception e)
                        {
                            if (!(_model is ModelBase modelBase))
                            {
                                return;
                            }

                            var details = new Dictionary <string, object>
                            {
                                { "consumer", work.Consumer },
                                { "context", work.Consumer }
                            };
                            modelBase.OnCallbackException(CallbackExceptionEventArgs.Build(e, details));
                        }
                        finally
                        {
                            work.PostExecute();
                        }
                    }
                }
            }
示例#6
0
 public void HandleBasicDeliver(IBasicConsumer consumer,
                                string consumerTag,
                                ulong deliveryTag,
                                bool redelivered,
                                string exchange,
                                string routingKey,
                                IBasicProperties basicProperties,
                                byte[] body)
 {
     UnlessShuttingDown(() =>
     {
         try
         {
             consumer.HandleBasicDeliver(consumerTag,
                                         deliveryTag,
                                         redelivered,
                                         exchange,
                                         routingKey,
                                         basicProperties,
                                         body);
         }
         catch (Exception e)
         {
             var details = new Dictionary <string, object>()
             {
                 { "consumer", consumer },
                 { "context", "HandleBasicDeliver" }
             };
             model.OnCallbackException(CallbackExceptionEventArgs.Build(e, details));
         }
     });
 }
示例#7
0
        public void OnConnectionUnblocked()
        {
            EventHandler <EventArgs> handler;

            lock (m_eventLock)
            {
                handler = m_connectionUnblocked;
            }
            if (handler != null)
            {
                foreach (EventHandler <EventArgs> h in handler.GetInvocationList())
                {
                    try
                    {
                        h(this, EventArgs.Empty);
                    }
                    catch (Exception e)
                    {
                        OnCallbackException(CallbackExceptionEventArgs.Build(e,
                                                                             new Dictionary <string, object>
                        {
                            { "context", "OnConnectionUnblocked" }
                        }));
                    }
                }
            }
        }
 protected override async Task Execute(ModelBase model, IAsyncBasicConsumer consumer)
 {
     try
     {
         await consumer.HandleBasicDeliver(_consumerTag,
                                           _deliveryTag,
                                           _redelivered,
                                           _exchange,
                                           _routingKey,
                                           _basicProperties,
                                           _body.Memory.Slice(0, _bodyLength)).ConfigureAwait(false);
     }
     catch (Exception e)
     {
         var details = new Dictionary <string, object>()
         {
             { "consumer", consumer },
             { "context", "HandleBasicDeliver" }
         };
         model.OnCallbackException(CallbackExceptionEventArgs.Build(e, details));
     }
     finally
     {
         _body.Dispose();
     }
 }
示例#9
0
        ///<summary>Broadcasts notification of the final shutdown of the connection.</summary>
        public void OnShutdown()
        {
            EventHandler <ShutdownEventArgs> handler;
            ShutdownEventArgs reason;

            lock (m_eventLock)
            {
                handler = m_connectionShutdown;
                reason  = m_closeReason;
                m_connectionShutdown = null;
            }
            if (handler != null)
            {
                foreach (EventHandler <ShutdownEventArgs> h in handler.GetInvocationList())
                {
                    try
                    {
                        h(this, reason);
                    }
                    catch (Exception e)
                    {
                        OnCallbackException(CallbackExceptionEventArgs.Build(e,
                                                                             new Dictionary <string, object>
                        {
                            { "context", "OnShutdown" }
                        }));
                    }
                }
            }
        }
示例#10
0
 protected override async Task Execute(ModelBase model, IBasicConsumer consumer)
 {
     try
     {
         await consumer.HandleModelShutdown(model, reason).ConfigureAwait(false);
     }
     catch (Exception e)
     {
         var details = new Dictionary <string, object>()
         {
             { "consumer", consumer },
             { "context", "HandleModelShutdown" }
         };
         await model.OnCallbackException(CallbackExceptionEventArgs.Build(e, details));
     }
 }
 protected override async Task Execute(ModelBase model, IAsyncBasicConsumer consumer)
 {
     try
     {
         await consumer.HandleBasicCancelOk(_consumerTag).ConfigureAwait(false);
     }
     catch (Exception e)
     {
         var details = new Dictionary <string, object>()
         {
             { "consumer", consumer },
             { "context", "HandleBasicCancelOk" }
         };
         model.OnCallbackException(CallbackExceptionEventArgs.Build(e, details));
     }
 }
示例#12
0
        protected override async Task ProcessChannelAsync()
        {
            while (await _reader.WaitToReadAsync().ConfigureAwait(false))
            {
                while (_reader.TryRead(out var work))
                {
                    try
                    {
                        var consumer    = work.Consumer;
                        var consumerTag = work.ConsumerTag;
                        switch (work.WorkType)
                        {
                        case WorkType.Deliver:
                            consumer.HandleBasicDeliver(consumerTag, work.DeliveryTag, work.Redelivered, work.Exchange, work.RoutingKey, work.BasicProperties, work.Body);
                            break;

                        case WorkType.Cancel:
                            consumer.HandleBasicCancel(consumerTag);
                            break;

                        case WorkType.CancelOk:
                            consumer.HandleBasicCancelOk(consumerTag);
                            break;

                        case WorkType.ConsumeOk:
                            consumer.HandleBasicConsumeOk(consumerTag);
                            break;

                        case WorkType.Shutdown:
                            consumer.HandleModelShutdown(_model, work.Reason);
                            break;
                        }
                    }
                    catch (Exception e)
                    {
                        _model.OnCallbackException(CallbackExceptionEventArgs.Build(e, work.WorkType.ToString(), work.Consumer));
                    }
                    finally
                    {
                        if (work.RentedArray != null)
                        {
                            ArrayPool <byte> .Shared.Return(work.RentedArray);
                        }
                    }
                }
            }
        }
示例#13
0
 public void HandleModelShutdown(IBasicConsumer consumer, ShutdownEventArgs reason)
 {
     // the only case where we ignore the shutdown flag.
     try
     {
         consumer.HandleModelShutdown(model, reason);
     }
     catch (Exception e)
     {
         var details = new Dictionary <string, object>()
         {
             { "consumer", consumer },
             { "context", "HandleModelShutdown" }
         };
         model.OnCallbackException(CallbackExceptionEventArgs.Build(e, details));
     }
 }
        ///<summary>Broadcasts notification of the final shutdown of the connection.</summary>
        public void OnShutdown()
        {
            EventHandler <ShutdownEventArgs> handler;
            ShutdownEventArgs reason;

            lock (m_eventLock)
            {
                handler = m_connectionShutdown;
                reason  = m_closeReason;
                m_connectionShutdown = null;
            }
            if (handler != null)
            {
                foreach (EventHandler <ShutdownEventArgs> h in handler.GetInvocationList())
                {
                    try
                    {
                        h(this, reason);
                    }
                    catch (Exception e)
                    {
                        OnCallbackException(CallbackExceptionEventArgs.Build(e,
                                                                             new Dictionary <string, object>
                        {
                            { "context", "OnShutdown" }
                        }));
                    }
                }
            }
#if NETFX_CORE
#pragma warning disable 0168
            try
            {
                Windows.UI.Xaml.Application.Current.Suspending -= this.HandleApplicationSuspend;
            }
            catch (Exception ex)
            {
                // If called from a desktop app (i.e. unit tests), then there is no current application
            }
#pragma warning restore 0168
#else
            AppDomain.CurrentDomain.DomainUnload -= HandleDomainUnload;
#endif
        }
示例#15
0
 public void HandleBasicCancelOk(IBasicConsumer consumer, string consumerTag)
 {
     UnlessShuttingDown(() =>
     {
         try
         {
             consumer.HandleBasicCancelOk(consumerTag);
         }
         catch (Exception e)
         {
             var details = new Dictionary <string, object>()
             {
                 { "consumer", consumer },
                 { "context", "HandleBasicCancelOk" }
             };
             model.OnCallbackException(CallbackExceptionEventArgs.Build(e, details));
         }
     });
 }
示例#16
0
        public AutorecoveringConnection(ConnectionConfig config, IEndpointResolver endpoints)
        {
            _config    = config;
            _endpoints = endpoints;

            IFrameHandler fh = _endpoints.SelectOne(_config.FrameHandlerFactory);

            _innerConnection = new Connection(_config, fh);

            Action <Exception, string> onException =
                (exception, context) =>
                _innerConnection.OnCallbackException(CallbackExceptionEventArgs.Build(exception, context));

            _recoverySucceededWrapper              = new EventingWrapper <EventArgs>("OnConnectionRecovery", onException);
            _connectionRecoveryErrorWrapper        = new EventingWrapper <ConnectionRecoveryErrorEventArgs>("OnConnectionRecoveryError", onException);
            _consumerTagChangeAfterRecoveryWrapper = new EventingWrapper <ConsumerTagChangedAfterRecoveryEventArgs>("OnConsumerRecovery", onException);
            _queueNameChangeAfterRecoveryWrapper   = new EventingWrapper <QueueNameChangedAfterRecoveryEventArgs>("OnQueueRecovery", onException);

            ConnectionShutdown += HandleConnectionShutdown;
        }
        public void HandleBasicDeliver(IBasicConsumer consumer,
                                       string consumerTag,
                                       ulong deliveryTag,
                                       bool redelivered,
                                       string exchange,
                                       string routingKey,
                                       IBasicProperties basicProperties,
                                       ReadOnlySpan <byte> body)
        {
            byte[] memoryCopyArray = ArrayPool <byte> .Shared.Rent(body.Length);

            Memory <byte> memoryCopy = new Memory <byte>(memoryCopyArray, 0, body.Length);

            body.CopyTo(memoryCopy.Span);
            UnlessShuttingDown(() =>
            {
                try
                {
                    consumer.HandleBasicDeliver(consumerTag,
                                                deliveryTag,
                                                redelivered,
                                                exchange,
                                                routingKey,
                                                basicProperties,
                                                memoryCopy);
                }
                catch (Exception e)
                {
                    var details = new Dictionary <string, object>()
                    {
                        { "consumer", consumer },
                        { "context", "HandleBasicDeliver" }
                    };
                    _model.OnCallbackException(CallbackExceptionEventArgs.Build(e, details));
                }
                finally
                {
                    ArrayPool <byte> .Shared.Return(memoryCopyArray);
                }
            });
        }
        public void HandleBasicDeliver(IBasicConsumer consumer,
                                       string consumerTag,
                                       ulong deliveryTag,
                                       bool redelivered,
                                       string exchange,
                                       string routingKey,
                                       IBasicProperties basicProperties,
                                       ReadOnlyMemory <byte> body,
                                       byte[] rentedArray)
        {
            UnlessShuttingDown(() =>
            {
                var bodyData = new BodyData(body, rentedArray);

                try
                {
                    consumer.HandleBasicDeliver(consumerTag,
                                                deliveryTag,
                                                redelivered,
                                                exchange,
                                                routingKey,
                                                basicProperties,
                                                in bodyData);
                }
                catch (Exception e)
                {
                    var details = new Dictionary <string, object>
                    {
                        { "consumer", consumer },
                        { "context", "HandleBasicDeliver" }
                    };
                    _model.OnCallbackException(CallbackExceptionEventArgs.Build(e, details));
                }
                finally
                {
                    bodyData.ReturnPayload();
                }
            });
        }
示例#19
0
 protected override async Task Execute(ModelBase model, IAsyncBasicConsumer consumer)
 {
     try
     {
         await consumer.HandleBasicDeliver(consumerTag,
                                           deliveryTag,
                                           redelivered,
                                           exchange,
                                           routingKey,
                                           basicProperties,
                                           body).ConfigureAwait(false);
     }
     catch (Exception e)
     {
         var details = new Dictionary <string, object>()
         {
             { "consumer", consumer },
             { "context", "HandleBasicDeliver" }
         };
         model.OnCallbackException(CallbackExceptionEventArgs.Build(e, details));
     }
 }
示例#20
0
        public Connection(IConnectionFactory factory, IFrameHandler frameHandler, string clientProvidedName = null)
        {
            ClientProvidedName = clientProvidedName;
            _factory           = factory;
            _frameHandler      = frameHandler;

            ConsumerWorkService = factory.DispatchConsumersAsync
                ? new AsyncConsumerWorkService(factory.ConsumerDispatchConcurrency)
                : new ConsumerWorkService(factory.ConsumerDispatchConcurrency);

            Action <Exception, string> onException = (exception, context) => OnCallbackException(CallbackExceptionEventArgs.Build(exception, context));

            _callbackExceptionWrapper   = new EventingWrapper <CallbackExceptionEventArgs>(string.Empty, (exception, context) => { });
            _connectionBlockedWrapper   = new EventingWrapper <ConnectionBlockedEventArgs>("OnConnectionBlocked", onException);
            _connectionUnblockedWrapper = new EventingWrapper <EventArgs>("OnConnectionUnblocked", onException);
            _connectionShutdownWrapper  = new EventingWrapper <ShutdownEventArgs>("OnShutdown", onException);

            _sessionManager = new SessionManager(this, 0);
            _session0       = new MainSession(this)
            {
                Handler = NotifyReceivedCloseOk
            };
            _model0 = (ModelBase)Protocol.CreateModel(_session0);

            StartMainLoop();
            Open();
        }
示例#21
0
        protected ModelBase(ISession session, ConsumerWorkService workService)
        {
            if (workService is AsyncConsumerWorkService asyncConsumerWorkService)
            {
                ConsumerDispatcher = new AsyncConsumerDispatcher(this, asyncConsumerWorkService);
            }
            else
            {
                ConsumerDispatcher = new ConcurrentConsumerDispatcher(this, workService);
            }

            _emptyBasicProperties = CreateBasicProperties();
            Action <Exception, string> onException = (exception, context) => OnCallbackException(CallbackExceptionEventArgs.Build(exception, context));

            _basicAcksWrapper         = new EventingWrapper <BasicAckEventArgs>("OnBasicAck", onException);
            _basicNacksWrapper        = new EventingWrapper <BasicNackEventArgs>("OnBasicNack", onException);
            _basicRecoverOkWrapper    = new EventingWrapper <EventArgs>("OnBasicRecover", onException);
            _basicReturnWrapper       = new EventingWrapper <BasicReturnEventArgs>("OnBasicReturn", onException);
            _callbackExceptionWrapper = new EventingWrapper <CallbackExceptionEventArgs>(string.Empty, (exception, context) => { });
            _flowControlWrapper       = new EventingWrapper <FlowControlEventArgs>("OnFlowControl", onException);
            _modelShutdownWrapper     = new EventingWrapper <ShutdownEventArgs>("OnModelShutdown", onException);
            _recoveryWrapper          = new EventingWrapper <EventArgs>("OnModelRecovery", onException);
            Initialise(session);
        }
        public AutorecoveringConnection(ConnectionFactory factory, string clientProvidedName = null)
        {
            _factory           = factory;
            ClientProvidedName = clientProvidedName;

            Action <Exception, string> onException = (exception, context) => _innerConnection.OnCallbackException(CallbackExceptionEventArgs.Build(exception, context));

            _recoverySucceededWrapper              = new EventingWrapper <EventArgs>("OnConnectionRecovery", onException);
            _connectionRecoveryErrorWrapper        = new EventingWrapper <ConnectionRecoveryErrorEventArgs>("OnConnectionRecoveryError", onException);
            _consumerTagChangeAfterRecoveryWrapper = new EventingWrapper <ConsumerTagChangedAfterRecoveryEventArgs>("OnConsumerRecovery", onException);
            _queueNameChangeAfterRecoveryWrapper   = new EventingWrapper <QueueNameChangedAfterRecoveryEventArgs>("OnQueueRecovery", onException);
        }
示例#23
0
        public Connection(IConnectionFactory factory, IFrameHandler frameHandler, string?clientProvidedName = null)
        {
            ClientProvidedName = clientProvidedName;
            _factory           = factory;
            _frameHandler      = frameHandler;

            Action <Exception, string> onException = (exception, context) => OnCallbackException(CallbackExceptionEventArgs.Build(exception, context));

            _callbackExceptionWrapper   = new EventingWrapper <CallbackExceptionEventArgs>(string.Empty, (exception, context) => { });
            _connectionBlockedWrapper   = new EventingWrapper <ConnectionBlockedEventArgs>("OnConnectionBlocked", onException);
            _connectionUnblockedWrapper = new EventingWrapper <EventArgs>("OnConnectionUnblocked", onException);
            _connectionShutdownWrapper  = new EventingWrapper <ShutdownEventArgs>("OnShutdown", onException);

            _sessionManager = new SessionManager(this, 0);
            _session0       = new MainSession(this);
            _model0         = (ModelBase)Protocol.CreateModel(factory, _session0);

            ClientProperties = new Dictionary <string, object?>(factory.ClientProperties)
            {
                ["capabilities"]    = Protocol.Capabilities,
                ["connection_name"] = ClientProvidedName
            };

            _mainLoopTask = Task.Factory.StartNew(MainLoop, TaskCreationOptions.LongRunning);
            Open();
        }
        protected ModelBase(bool dispatchAsync, int concurrency, ISession session)
        {
            ConsumerDispatcher = dispatchAsync ?
                                 (IConsumerDispatcher) new AsyncConsumerDispatcher(this, concurrency) :
                                 new ConsumerDispatcher(this, concurrency);

            _emptyBasicProperties = CreateBasicProperties();
            Action <Exception, string> onException = (exception, context) => OnCallbackException(CallbackExceptionEventArgs.Build(exception, context));

            _basicAcksWrapper         = new EventingWrapper <BasicAckEventArgs>("OnBasicAck", onException);
            _basicNacksWrapper        = new EventingWrapper <BasicNackEventArgs>("OnBasicNack", onException);
            _basicRecoverOkWrapper    = new EventingWrapper <EventArgs>("OnBasicRecover", onException);
            _basicReturnWrapper       = new EventingWrapper <BasicReturnEventArgs>("OnBasicReturn", onException);
            _callbackExceptionWrapper = new EventingWrapper <CallbackExceptionEventArgs>(string.Empty, (exception, context) => { });
            _flowControlWrapper       = new EventingWrapper <FlowControlEventArgs>("OnFlowControl", onException);
            _modelShutdownWrapper     = new EventingWrapper <ShutdownEventArgs>("OnModelShutdown", onException);
            _recoveryWrapper          = new EventingWrapper <EventArgs>("OnModelRecovery", onException);
            session.CommandReceived   = HandleCommand;
            session.SessionShutdown  += OnSessionShutdown;
            Session = session;
        }
示例#25
0
        public Connection(ConnectionConfig config, IFrameHandler frameHandler)
        {
            _config       = config;
            _frameHandler = frameHandler;

            Action <Exception, string> onException = (exception, context) => OnCallbackException(CallbackExceptionEventArgs.Build(exception, context));

            _callbackExceptionWrapper   = new EventingWrapper <CallbackExceptionEventArgs>(string.Empty, (exception, context) => { });
            _connectionBlockedWrapper   = new EventingWrapper <ConnectionBlockedEventArgs>("OnConnectionBlocked", onException);
            _connectionUnblockedWrapper = new EventingWrapper <EventArgs>("OnConnectionUnblocked", onException);
            _connectionShutdownWrapper  = new EventingWrapper <ShutdownEventArgs>("OnShutdown", onException);

            _sessionManager = new SessionManager(this, 0);
            _session0       = new MainSession(this);
            _model0         = new Model(_config, _session0);;

            ClientProperties = new Dictionary <string, object?>(_config.ClientProperties)
            {
                ["capabilities"]    = Protocol.Capabilities,
                ["connection_name"] = ClientProvidedName
            };

            _mainLoopTask = Task.Factory.StartNew(MainLoop, TaskCreationOptions.LongRunning);
            try
            {
                Open();
            }
            catch
            {
                var ea = new ShutdownEventArgs(ShutdownInitiator.Library, Constants.InternalError, "FailedOpen");
                Close(ea, true, TimeSpan.FromSeconds(5));
                throw;
            }
        }
示例#26
0
        protected ModelBase(ConnectionConfig config, ISession session)
        {
            ContinuationTimeout = config.ContinuationTimeout;
            ConsumerDispatcher  = config.DispatchConsumersAsync ?
                                  (IConsumerDispatcher) new AsyncConsumerDispatcher(this, config.DispatchConsumerConcurrency) :
                                  new ConsumerDispatcher(this, config.DispatchConsumerConcurrency);

            Action <Exception, string> onException = (exception, context) => OnCallbackException(CallbackExceptionEventArgs.Build(exception, context));

            _basicAcksWrapper         = new EventingWrapper <BasicAckEventArgs>("OnBasicAck", onException);
            _basicNacksWrapper        = new EventingWrapper <BasicNackEventArgs>("OnBasicNack", onException);
            _basicRecoverOkWrapper    = new EventingWrapper <EventArgs>("OnBasicRecover", onException);
            _basicReturnWrapper       = new EventingWrapper <BasicReturnEventArgs>("OnBasicReturn", onException);
            _callbackExceptionWrapper = new EventingWrapper <CallbackExceptionEventArgs>(string.Empty, (exception, context) => { });
            _flowControlWrapper       = new EventingWrapper <FlowControlEventArgs>("OnFlowControl", onException);
            _modelShutdownWrapper     = new EventingWrapper <ShutdownEventArgs>("OnModelShutdown", onException);
            _recoveryWrapper          = new EventingWrapper <EventArgs>("OnModelRecovery", onException);
            session.CommandReceived   = HandleCommand;
            session.SessionShutdown  += OnSessionShutdown;
            Session = session;
        }