/// <summary> /// Create an actor to act as a subscriber on behalf of the specified observer. /// </summary> /// <param name="createSubscriber"> /// The <see cref="CreateSubscriber"/> request message. /// </param> /// <returns></returns> IActorRef CreateSubscriberActor(CreateSubscriber <TMessage> createSubscriber) { if (createSubscriber == null) { throw new ArgumentNullException(nameof(createSubscriber)); } IObserver <TMessage> observer = createSubscriber.Observer; return(Context.ActorOf( Props.Create <EventSubscriber <TMessage> >(observer) .WithSupervisorStrategy( new OneForOneStrategy(error => // Slightly hacky way of notifying observer of any errors encountered by the subscriber actor. { observer.OnError(error); return Directive.Stop; }) ) )); }
/// <summary> /// Create an actor to act as a subscriber on behalf of the specified observer. /// </summary> /// <param name="createSubscriber"> /// The <see cref="CreateSubscriber"/> request that specifies the observer to use. /// </param> /// <returns> /// A <see cref="SubscriberCreated"/> message representing the newly-created subscriber. /// </returns> void CreateSubscriberActor(CreateSubscriber createSubscriber) { if (createSubscriber == null) { throw new ArgumentNullException(nameof(createSubscriber)); } IActorRef subscriberManager; if (!_subscriberManagers.TryGetValue(createSubscriber.BaseMessageType, out subscriberManager)) { subscriberManager = Context.ActorOf( SubscriberManagerProps(createSubscriber.BaseMessageType) ); _subscriberManagers.Add(createSubscriber.BaseMessageType, subscriberManager); _subscriberManagerReverseLookup.Add(subscriberManager, createSubscriber.BaseMessageType); Context.Watch(subscriberManager); } // Forward the message to the typed subscriber manager; they'll know what to do with it. subscriberManager.Forward(createSubscriber); }
/// <summary> /// Create an actor to act as a subscriber on behalf of the specified observer. /// </summary> /// <param name="createSubscriber"> /// The <see cref="CreateSubscriber"/> request that specifies the observer to use. /// </param> /// <returns> /// A <see cref="SubscriberCreated"/> message representing the newly-created subscriber. /// </returns> void CreateSubscriberActor(CreateSubscriber createSubscriber) { if (createSubscriber == null) throw new ArgumentNullException(nameof(createSubscriber)); IActorRef subscriberManager; if (!_subscriberManagers.TryGetValue(createSubscriber.BaseMessageType, out subscriberManager)) { subscriberManager = Context.ActorOf( SubscriberManagerProps(createSubscriber.BaseMessageType) ); _subscriberManagers.Add(createSubscriber.BaseMessageType, subscriberManager); _subscriberManagerReverseLookup.Add(subscriberManager, createSubscriber.BaseMessageType); Context.Watch(subscriberManager); } // Forward the message to the typed subscriber manager; they'll know what to do with it. subscriberManager.Forward(createSubscriber); }