Beispiel #1
0
 public void Close()
 {
     if (_socket == null)
     {
         return;
     }
     _active = false;
     try
     {
         _socket.Shutdown(SocketShutdown.Both);
     }
     catch
     {
     }
     finally
     {
         _socket.Close();
         _socket   = null;
         _receiver = null;
         if (ClosedHandler != null)
         {
             ClosedHandler(this);
         }
     }
 }
Beispiel #2
0
 public Session(string name)
 {
     _name              = name ?? string.Empty;
     _sessionType       = SessionType.Unknown;
     _socket            = null;
     _receiver          = null;
     _active            = false;
     _disposed          = false;
     ConnectedHandler   = null;
     ClosedHandler      = null;
     ErrorHandler       = null;
     CustomErrorHandler = null;
     ReceiveHandler     = null;
     SendHandler        = null;
 }
Beispiel #3
0
        async Task IFilter <NamespaceContext> .Send(NamespaceContext context, IPipe <NamespaceContext> next)
        {
            var clientContext = context.GetPayload <ClientContext>();

            var clientSettings = context.GetPayload <ClientSettings>();

            if (_log.IsDebugEnabled)
            {
                _log.DebugFormat("Creating message receiver for {0}", clientContext.InputAddress);
            }

            using (var scope = context.CreateScope($"{TypeMetadataCache<MessageReceiverFilter>.ShortName} - {clientContext.InputAddress}"))
            {
                var receiver = new SessionReceiver(clientContext, _receivePipe, clientSettings, scope, _topology);

                await receiver.Start(context).ConfigureAwait(false);

                await scope.Ready.ConfigureAwait(false);

                await context.Ready(new ReceiveTransportReadyEvent(clientContext.InputAddress)).ConfigureAwait(false);

                scope.SetReady();

                try
                {
                    await scope.Completed.ConfigureAwait(false);
                }
                finally
                {
                    var metrics = receiver.GetDeliveryMetrics();

                    await context.Completed(new ReceiveTransportCompletedEvent(clientContext.InputAddress, metrics)).ConfigureAwait(false);

                    if (_log.IsDebugEnabled)
                    {
                        _log.DebugFormat("Consumer {0}: {1} received, {2} concurrent", clientContext.InputAddress,
                                         metrics.DeliveryCount,
                                         metrics.ConcurrentDeliveryCount);
                    }
                }
            }

            await next.Send(context).ConfigureAwait(false);
        }
Beispiel #4
0
    private void Initialize(AddressFamily addressFamily)
    {
        if (_socket != null)
        {
            Close();
            _socket = null;
        }
        switch (addressFamily)
        {
        case AddressFamily.InterNetwork:
            _sessionType = SessionType.IPv4;
            break;

        case AddressFamily.InterNetworkV6:
            _sessionType = SessionType.IPv6;
            break;

        default:
            throw new Exception(string.Format("Not supported address family '{0}'.", addressFamily.ToString()));
        }
        _socket   = new Socket(addressFamily, SocketType.Stream, ProtocolType.Tcp);
        _receiver = new SessionReceiver(_defaultMaxPacketLength);
        _receiver.Reset(_defaultPacketLength);
    }
        async Task IFilter <ConnectionContext> .Send(ConnectionContext context, IPipe <ConnectionContext> next)
        {
            var receiveSettings = context.GetPayload <ReceiveSettings>();

            var queuePath = context.GetQueuePath(receiveSettings.QueueDescription);

            var inputAddress = context.GetQueueAddress(receiveSettings.QueueDescription);

            if (_log.IsDebugEnabled)
            {
                _log.DebugFormat("Creating message receiver for {0}", inputAddress);
            }


            QueueClient queueClient = null;

            try
            {
                var messagingFactory = await context.SessionMessagingFactory.ConfigureAwait(false);

                queueClient = messagingFactory.CreateQueueClient(queuePath);

                queueClient.PrefetchCount = receiveSettings.PrefetchCount;

                using (var scope = _supervisor.CreateScope($"{TypeMetadataCache<MessageReceiverFilter>.ShortName} - {inputAddress}"))
                {
                    var receiver = new SessionReceiver(context, queueClient, inputAddress, _receivePipe, receiveSettings, _receiveObserver, scope);

                    await scope.Ready.ConfigureAwait(false);

                    await _endpointObserver.Ready(new Ready(inputAddress)).ConfigureAwait(false);

                    scope.SetReady();

                    try
                    {
                        await scope.Completed.ConfigureAwait(false);
                    }
                    finally
                    {
                        ReceiverMetrics metrics = receiver;

                        await _endpointObserver.Completed(new Completed(inputAddress, metrics)).ConfigureAwait(false);

                        if (_log.IsDebugEnabled)
                        {
                            _log.DebugFormat("Consumer {0}: {1} received, {2} concurrent", queuePath,
                                             metrics.DeliveryCount,
                                             metrics.ConcurrentDeliveryCount);
                        }
                    }
                }
            }
            finally
            {
                if (queueClient != null && !queueClient.IsClosed)
                {
                    await queueClient.CloseAsync().ConfigureAwait(false);
                }
            }

            await next.Send(context).ConfigureAwait(false);
        }