Exemple #1
0
 public RemoteDeliver(Proto.MessageHeader header, object message, PID target, PID sender, int serializerId)
 {
     Header       = header;
     Message      = message;
     Target       = target;
     Sender       = sender;
     SerializerId = serializerId;
 }
        public override async Task Receive(IAsyncStreamReader <MessageBatch> requestStream,
                                           IServerStreamWriter <Unit> responseStream, ServerCallContext context)
        {
            var targets = new PID[100];
            await requestStream.ForEachAsync(batch =>
            {
                if (_suspended)
                {
                    return(Actor.Done);
                }

                //only grow pid lookup if needed
                if (batch.TargetNames.Count > targets.Length)
                {
                    targets = new PID[batch.TargetNames.Count];
                }

                for (int i = 0; i < batch.TargetNames.Count; i++)
                {
                    targets[i] = new PID(ProcessRegistry.Instance.Address, batch.TargetNames[i]);
                }
                var typeNames = batch.TypeNames.ToArray();
                foreach (var envelope in batch.Envelopes)
                {
                    var target   = targets[envelope.Target];
                    var typeName = typeNames[envelope.TypeId];
                    var message  = Serialization.Deserialize(typeName, envelope.MessageData, envelope.SerializerId);

                    if (message is Terminated msg)
                    {
                        var rt = new RemoteTerminate(target, msg.Who);
                        EndpointManager.RemoteTerminate(rt);
                    }
                    else if (message is SystemMessage sys)
                    {
                        target.SendSystemMessage(sys);
                    }
                    else
                    {
                        Proto.MessageHeader header = null;
                        if (envelope.MessageHeader != null)
                        {
                            header = new Proto.MessageHeader();
                            foreach (var(k, v) in envelope.MessageHeader.HeaderData)
                            {
                                header.Add(k, v);
                            }
                        }
                        var localEnvelope = new Proto.MessageEnvelope(message, envelope.Sender, header);
                        target.Tell(localEnvelope);
                    }
                }

                return(Actor.Done);
            });
        }
Exemple #3
0
        private void ReceiveMessages(MessageEnvelope envelope, object message, PID target)
        {
            Proto.MessageHeader?header = null;

            if (envelope.MessageHeader is not null)
            {
                header = new Proto.MessageHeader(envelope.MessageHeader.HeaderData);
            }

            // Logger.LogDebug("[EndpointReader] Forwarding remote user message {@Message}", message);
            var localEnvelope = new Proto.MessageEnvelope(message, envelope.Sender, header);

            _system.Root.Send(target, localEnvelope);
        }
        public override async Task ConnectClient(IAsyncStreamReader <ClientMessageBatch> requestStream,
                                                 IServerStreamWriter <MessageBatch> responseStream, ServerCallContext context)
        {
            _logger.LogDebug($"Spawning Client EndpointWriter");

            _logger.LogDebug($"Request headers count is {context.RequestHeaders.Count} - {context.RequestHeaders.Select(entry => entry.Key + ":" + entry.Value).Aggregate((acc, value) => acc + "," + value)}");
            var clientIdHeader = context.RequestHeaders.FirstOrDefault(entry => entry.Key == "clientid");
            var clientId       = clientIdHeader?.Value;

            if (clientId == null)
            {
                clientId = Guid.NewGuid().ToString();
                _logger.LogWarning($"clientId header is not set - generating random client id {clientId}");
            }


            var clientHostEndpointWriter = await SpawnClientHostEndpointWriter(responseStream, clientId);


            try
            {
                while (await requestStream.MoveNext())
                {
                    var clientMessageBatch = requestStream.Current;

                    var targetAddress = clientMessageBatch.Address;

                    _logger.LogDebug($"Received Batch for {targetAddress}");

                    foreach (var envelope in clientMessageBatch.Batch.Envelopes)
                    {
                        var message = Serialization.Deserialize(clientMessageBatch.Batch.TypeNames[envelope.TypeId],
                                                                envelope.MessageData, envelope.SerializerId);

                        _logger.LogDebug($"Batch Message {message.GetType()}");

                        var target = new PID(targetAddress, clientMessageBatch.Batch.TargetNames[envelope.Target]);


                        _logger.LogDebug($"Target is {target}");



                        //Forward the message to the correct endpoint
                        Proto.MessageHeader header = null;
                        if (envelope.MessageHeader != null)
                        {
                            header = new Proto.MessageHeader(envelope.MessageHeader.HeaderData);
                        }

                        var forwardingEnvelope = new Proto.MessageEnvelope(message, envelope.Sender, header);

                        _logger.LogDebug($"Sending message {message.GetType()} to target {target} from {envelope.Sender}");

                        RootContext.Empty.Send(target, forwardingEnvelope);
                    }
                }

                _logger.LogDebug("Finished Request Stream - stopping connection manager");

                await clientHostEndpointWriter.PoisonAsync();

                _logger.LogDebug("Client Endpoint manager shut down");
            }
            catch (Exception ex)
            {
                _logger.LogCritical(ex, "Exception on Client Host");
                throw ex;
            }
        }