public IClientConnection AcceptConnection(
            ITransportConnection connection,
            ClientConnectionDescriptor info)
        {
            var clientConnection = new ClientConnection(connection, info);

            lock (_connections)
            {
                if (_connections.ContainsKey(clientConnection.Id))
                {
                    throw new BrokerException($"Connection id already exists: {clientConnection.Id}");
                }
                _connections[clientConnection.Id] = clientConnection;
                var appInstanceId = clientConnection.Info.ApplicationInstanceId;
                if (!_appInstanceConnections.TryGetValue(appInstanceId, out var connectionList))
                {
                    connectionList = new List <IClientConnection>();
                    _appInstanceConnections[appInstanceId] = connectionList;
                }
                connectionList.Add(clientConnection);
                clientConnection.Completion
                .ContinueWithSynchronously((Action <Task, object>)OnClientConnectionCompleted, clientConnection)
                .IgnoreAwait(Log);
                if (_connectionWaiters.TryGetValue(appInstanceId, out var waiter))
                {
                    waiter.TryComplete(clientConnection);
                }
                _connectionWaiters.Remove(info.ApplicationInstanceId);
            }
            return(clientConnection);
        }
Exemplo n.º 2
0
        public ClientConnection(ITransportConnection connection, ClientConnectionDescriptor clientInfo)
        {
            Id          = connection.Id;
            _log        = LogManager.GetLogger <ClientConnection>(Id.ToString());
            Info        = clientInfo;
            _connection = connection;
            var listen = new ProducingChannel <ITransportChannel>(1, ListenAsync);

            IncomingChannels = listen;
            Completion       = TaskRunner.RunInBackground(ProcessAsync);
        }
Exemplo n.º 3
0
        public async Task <IClientConnection> HandleAsync(ITransportConnection connection)
        {
            Log.Trace("Accepting new connection {0}", connection.Id);
            var channel = await connection.IncomingChannels.ReadAsync().ConfigureAwait(false);

            var frame = await channel.In.ReadAsync().ConfigureAwait(false);

            using (var payload = frame.Payload)
                using (var connectRequest = _serializer.DeserializeConnectRequest(payload))
                {
                    if (!_registryService.IsApplicationDefined(connectRequest.ApplicationId))
                    {
                        throw new BrokerException($"Connection rejected because application id is unknown to broker: {connectRequest.ApplicationId}");
                    }
                    using (var connectResponse = _messageFactory.CreateConnectResponse(connection.Id))
                    {
                        var serializedResponse = _serializer.Serialize(connectResponse);
                        try
                        {
                            Log.Trace("Sending connect response ({0} bytes): {1}", connectResponse, serializedResponse.Count);
                            await channel.Out.WriteAsync(new TransportMessageFrame(serializedResponse)).ConfigureAwait(false);
                        }
                        catch
                        {
                            serializedResponse.Dispose();
                            throw;
                        }
                        channel.Out.TryComplete();
                        await channel.Completion.ConfigureAwait(false);

                        var info =
                            new ClientConnectionDescriptor(
                                connectResponse.ConnectionId,
                                connectRequest.ApplicationId,
                                connectRequest.ApplicationInstanceId);
                        var clientConnection = _connectionTracker.AcceptConnection(connection, info);
                        Log.Info("New connection accepted: {0}", clientConnection);
                        return(clientConnection);
                    }
                }
        }