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); } } }
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); } } }
/// <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(); }
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); } }