private void Handle(Request m)
{
var message = m.Message;
var boundActor = GetBoundActor(m.ActorId);
if (boundActor == null)
{
Sender.Tell(new ResponseMessage { RequestId = message.RequestId, Exception = new RequestTargetException() });
return;
}
var boundType = boundActor.FindBoundType(message.InvokePayload.GetInterfaceType());
if (boundType == null)
{
Sender.Tell(new ResponseMessage { RequestId = message.RequestId, Exception = new RequestHandlerNotFoundException() });
return;
}
if (boundType.IsTagOverridable)
{
var msg = (IPayloadTagOverridable)message.InvokePayload;
msg.SetTag(boundType.TagValue);
}
var observerUpdatable = message.InvokePayload as IPayloadObserverUpdatable;
if (observerUpdatable != null)
{
observerUpdatable.Update(o =>
{
var observer = ((InterfacedObserver)o);
if (observer != null)
{
// naive observer channel management. but this is good enough,
// because client-side of slim channel usually keep observer id unique.
_observerChannelMap[observer.ObserverId] = observer.Channel;
observer.Channel = new AkkaReceiverNotificationChannel(Self);
}
});
}
_requestMap[message.RequestId] = Sender;
boundActor.Actor.Tell(message, Self);
}