Esempio n. 1
0
        private void StartrxnProcessors(IReportStatus logger, IContainer container, Type[] events, IScheduler eventDelivery)
        {
            var startedProcessors = new List <dynamic>();

            foreach (var @event in events)
            {
                try
                {
                    //now we create an rxnProcessor of each IRxn discovered, then ask the container
                    //for any interfaces which implement them.
                    var processorForEvent         = typeof(IRxnProcessor <>).MakeGenericType(@event);
                    var allProcessorsForEventType = typeof(IEnumerable <>).MakeGenericType(processorForEvent);
                    var allProcessors             = ((IEnumerable <dynamic>)container.Resolve(allProcessorsForEventType)).ToArray();

                    Func <string, Rxns.Interfaces.IReactor <IRxn> > getReactorByName = reactorName => container.Resolve <IManageReactors>().StartReactor(reactorName).Reactor;

                    //now register any processors found with the subscription to the events they are interested in
                    var distinctProcessors = allProcessors.Distinct().ToArray();
                    foreach (var p in distinctProcessors.Except(startedProcessors))
                    {
                        var reactor = RxnCreator.GetReactorFor((object)p, getReactorByName);
                        //this method will hookup ALL process methods of a processor in one call
                        reactor.Connect((object)p, eventDelivery);
                    }

                    startedProcessors.AddRange(distinctProcessors); //so we need to keep a list processors we see so we dont attach them twice
                }
                catch (Exception e)
                {
                    logger.OnError(e);
                }
            }
        }
Esempio n. 2
0
        private void StartReactions(IReportStatus logger, IContainer container, Type[] events, IScheduler eventDelivery)
        {
            foreach (var @event in events)
            {
                try
                {
                    var processorForEvent         = typeof(IReactTo <>).MakeGenericType(@event);
                    var allProcessorsForEventType = typeof(IEnumerable <>).MakeGenericType(processorForEvent);
                    var allProcessors             = (IEnumerable <dynamic>)container.Resolve(allProcessorsForEventType);

                    Func <string, Rxns.Interfaces.IReactor <IRxn> > getReactorByName = reactorName => container.Resolve <IManageReactors>().StartReactor(reactorName).Reactor;

                    //now attach any processors found with the subscription to the events they are interested in
                    foreach (object reaction in allProcessors.Distinct())
                    {
                        var reactor = RxnCreator.GetReactorFor(reaction, getReactorByName);
                        reactor.Connect((IReactTo <IRxn>)reaction, eventDelivery);
                    }
                }
                catch (Exception e)
                {
                    logger.OnError(e);
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// todo: fix issue with not broadcasting all test stats to appstatus, only first time
        /// </summary>
        /// <param name="testCluster"></param>
        /// <param name="unitTestToRun"></param>
        /// <param name="publusher"></param>
        /// <param name="reactorMgr"></param>
        private void BroadcasteStatsToTestArena(IManageReactors reactorMgr)
        {
            var bfgReactor = reactorMgr.GetOrCreate("bfg").Reactor;

            //need to fix health which will allow this to be viewed on the appstatus portal. should monitor health of fanout stratergy
            //
            //IMonitorActionFactory<IRxn> health =MonitorHealth
            RxnCreator.MonitorHealth <IRxn>(bfgReactor, "theBFG", out var _before, () => Rxn.Empty()).SelectMany(bfgReactor.Output).Until();


            $"Heartbeating".LogDebug();
            bfgReactor.Output.Publish(new PerformAPing()).Until();
        }
Esempio n. 4
0
        private void ConnectToReactors(object reaction, IManageResources resourceManager)
        {
            if (reaction.ImplementsInterface(typeof(IRxnPublisher <IRxn>)))
            {
                OnVerbose("Connecting Publisher", reaction.GetType());

                var page        = reaction as IRxnPublisher <IRxn>;
                var pageReactor = RxnCreator.GetReactorFor(page, name => _reactorManager.StartReactor(name).Reactor);

                pageReactor.Connect(page).DisposedBy(resourceManager);
            }

            if (reaction.ImplementsInterface(typeof(IReactTo <IRxn>)))
            {
                OnVerbose("Connecting ReactTo", reaction.GetType());

                var page        = reaction as IReactTo <IRxn>;
                var pageReactor = RxnCreator.GetReactorFor(page, name => _reactorManager.StartReactor(name).Reactor);

                pageReactor.Connect(page, RxnSchedulers.TaskPool).DisposedBy(resourceManager);
            }
        }