示例#1
0
        protected void OnPacket(Packet packet)
        {
            switch (packet.Type)
            {
            case PacketType.Notification:
                if (ObserverRegistry.OnNotificationPacket(packet) == false)
                {
                    _logger?.WarnFormat("Notification didn't find observer. (ObserverId={0}, Message={1})",
                                        packet.ActorId, packet.Message.GetType().Name);
                }
                break;

            case PacketType.Response:
                ResponseWaitingItem waitingItem;
                if (_responseWaitingItems.TryRemove(packet.RequestId, out waitingItem))
                {
                    var actorRefUpdatable = packet.Message as IPayloadActorRefUpdatable;
                    if (actorRefUpdatable != null)
                    {
                        actorRefUpdatable.Update(a =>
                        {
                            var actorRef = (InterfacedActorRef)a;
                            var target   = (BoundActorTarget)actorRef.Target;
                            if (string.IsNullOrEmpty(target.Address))
                            {
                                // use this channel
                                InterfacedActorRefModifier.SetRequestWaiter(actorRef, this);
                            }
                            else
                            {
                                // routed and use channel with specified address
                                if (ChannelRouter != null)
                                {
                                    var channel = ChannelRouter(this, target.Address);
                                    if (channel != null)
                                    {
                                        InterfacedActorRefModifier.SetTarget(actorRef, new BoundActorTarget(target.Id));
                                        InterfacedActorRefModifier.SetRequestWaiter(actorRef, channel);
                                    }
                                }
                            }
                        });
                    }

                    waitingItem.ResponseHandler(waitingItem.TaskCompletionSource, new ResponseMessage
                    {
                        RequestId     = packet.RequestId,
                        ReturnPayload = (IValueGetable)packet.Message,
                        Exception     = packet.Exception
                    });
                }
                break;
            }
        }
示例#2
0
 public void RemoveObserver <TObserver>(TObserver observer)
     where TObserver : IInterfacedObserver
 {
     ObserverRegistry.Remove(observer);
 }
示例#3
0
 public TObserver CreateObserver <TObserver>(TObserver observer, bool startPending = false)
     where TObserver : IInterfacedObserver
 {
     return(ObserverRegistry.Create(observer, startPending));
 }