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; } }
public void RemoveObserver <TObserver>(TObserver observer) where TObserver : IInterfacedObserver { ObserverRegistry.Remove(observer); }
public TObserver CreateObserver <TObserver>(TObserver observer, bool startPending = false) where TObserver : IInterfacedObserver { return(ObserverRegistry.Create(observer, startPending)); }