예제 #1
0
 private async Task SendEnvelopesAsync(MessageBatch batch, IContext context)
 {
     try
     {
         await _streamWriter.WriteAsync(batch);
     }
     catch (Exception x)
     {
         context.Stash();
         _logger.LogError($"gRPC Failed to send to address {_address}, reason {x.Message}");
         throw;
     }
 }
예제 #2
0
 private async Task SendEnvelopesAsync(MessageBatch batch, IContext context)
 {
     try
     {
         await _streamWriter.WriteAsync(batch);
     }
     catch (Exception x)
     {
         context.Stash();
         Console.WriteLine($"[REMOTING] gRPC Failed to send to address {_address}, reason {x.Message}");
         throw;
     }
 }
예제 #3
0
        public async Task ReceiveAsync(IContext context)
        {
            switch (context.Message)
            {
            case Started m:
                await StartedAsync();

                break;

            case Stopped m:
                await StoppedAsync();

                break;

            case Restarting m:
                await RestartingAsync();

                break;

            case IEnumerable <RemoteDeliver> m:
                var envelopes      = new List <MessageEnvelope>();
                var typeNames      = new Dictionary <string, int>();
                var targetNames    = new Dictionary <string, int>();
                var typeNameList   = new List <string>();
                var targetNameList = new List <string>();
                foreach (var rd in m)
                {
                    var targetName = rd.Target.Id;
                    if (!targetNames.ContainsKey(targetName))
                    {
                        targetNames.Add(targetName, typeNames.Count);
                        targetNameList.Add(targetName);
                    }
                    var targetId = targetNames[targetName];

                    var typeName = rd.Message.Descriptor.File.Package + "." + rd.Message.Descriptor.Name;
                    if (!typeNames.ContainsKey(typeName))
                    {
                        typeNames.Add(typeName, typeNames.Count);
                        typeNameList.Add(typeName);
                    }
                    var typeId = typeNames[typeName];

                    var bytes    = Serialization.Serialize(rd.Message);
                    var envelope = new MessageEnvelope
                    {
                        MessageData = bytes,
                        Sender      = rd.Sender,
                        Target      = targetId,
                        TypeId      = typeId,
                    };
                    envelopes.Add(envelope);
                }

                var batch = new MessageBatch();
                batch.TargetNames.AddRange(targetNameList);
                batch.TypeNames.AddRange(typeNameList);
                batch.Envelopes.AddRange(envelopes);

                await SendEnvelopesAsync(batch, context);

                break;
            }
        }
예제 #4
0
        public Task ReceiveAsync(IContext context)
        {
            var task = Actor.Done;

            switch (context.Message)
            {
            case Started _:
                task = StartedAsync();
                break;

            case Stopped _:
                task = StoppedAsync();
                _logger.LogDebug($"Stopped EndpointWriter at {_address}");
                break;

            case Restarting _:
                task = RestartingAsync();
                break;

            case EndpointTerminatedEvent _:
                context.Self.Stop();
                break;

            case IEnumerable <RemoteDeliver> m:
                var envelopes      = new List <MessageEnvelope>();
                var typeNames      = new Dictionary <string, int>();
                var targetNames    = new Dictionary <string, int>();
                var typeNameList   = new List <string>();
                var targetNameList = new List <string>();
                foreach (var rd in m)
                {
                    var targetName   = rd.Target.Id;
                    var serializerId = rd.SerializerId == -1 ? _serializerId : rd.SerializerId;

                    if (!targetNames.TryGetValue(targetName, out var targetId))
                    {
                        targetId = targetNames[targetName] = targetNames.Count;
                        targetNameList.Add(targetName);
                    }

                    var typeName = Serialization.GetTypeName(rd.Message, serializerId);
                    if (!typeNames.TryGetValue(typeName, out var typeId))
                    {
                        typeId = typeNames[typeName] = typeNames.Count;
                        typeNameList.Add(typeName);
                    }

                    MessageHeader header = null;
                    if (rd.Header != null && rd.Header.Count > 0)
                    {
                        header = new MessageHeader();
                        header.HeaderData.Add(rd.Header.ToDictionary());
                    }

                    var bytes    = Serialization.Serialize(rd.Message, serializerId);
                    var envelope = new MessageEnvelope
                    {
                        MessageData   = bytes,
                        Sender        = rd.Sender,
                        Target        = targetId,
                        TypeId        = typeId,
                        SerializerId  = serializerId,
                        MessageHeader = header,
                    };

                    envelopes.Add(envelope);
                }

                var batch = new MessageBatch();
                batch.TargetNames.AddRange(targetNameList);
                batch.TypeNames.AddRange(typeNameList);
                batch.Envelopes.AddRange(envelopes);

                task = SendEnvelopesAsync(batch, context);
                break;
            }

            return(task);
        }
예제 #5
0
        public async Task ReceiveAsync(IContext context)
        {
            switch (context.Message)
            {
            case Started _:
                await StartedAsync();

                break;

            case Stopped _:
                await StoppedAsync();

                _logger.LogDebug($"Stopped EndpointWriter at {_address}");
                break;

            case Restarting _:
                await RestartingAsync();

                break;

            case IEnumerable <RemoteDeliver> m:
                var envelopes      = new List <MessageEnvelope>();
                var typeNames      = new Dictionary <string, int>();
                var targetNames    = new Dictionary <string, int>();
                var typeNameList   = new List <string>();
                var targetNameList = new List <string>();
                foreach (var rd in m)
                {
                    var targetName   = rd.Target.Id;
                    var serializerId = rd.SerializerId == -1 ? _serializerId : rd.SerializerId;

                    if (!targetNames.TryGetValue(targetName, out var targetId))
                    {
                        targetId = targetNames[targetName] = targetNames.Count;
                        targetNameList.Add(targetName);
                    }

                    var typeName = Serialization.GetTypeName(rd.Message, serializerId);
                    if (!typeNames.TryGetValue(typeName, out var typeId))
                    {
                        typeId = typeNames[typeName] = typeNames.Count;
                        typeNameList.Add(typeName);
                    }

                    var bytes    = Serialization.Serialize(rd.Message, serializerId);
                    var envelope = new MessageEnvelope
                    {
                        MessageData  = bytes,
                        Sender       = rd.Sender,
                        Target       = targetId,
                        TypeId       = typeId,
                        SerializerId = serializerId
                    };
                    envelopes.Add(envelope);
                }

                var batch = new MessageBatch();
                batch.TargetNames.AddRange(targetNameList);
                batch.TypeNames.AddRange(typeNameList);
                batch.Envelopes.AddRange(envelopes);

                await SendEnvelopesAsync(batch, context);

                break;
            }
        }