/// <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;
            })
                           )
                       ));
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }