예제 #1
0
        public async Task Start()
        {
            Container = new UnityContainer();
            Systems   = _actorSystemFactory.Invoke();
            System    = Systems.First();

            System.InitDomainEventsSerialization(EventsAdaptersCatalog);

            _transportMode = Systems.Length > 1 ? TransportMode.Cluster : TransportMode.Standalone;
            System.RegisterOnTermination(OnSystemTermination);
            System.AddDependencyResolver(new UnityDependencyResolver(Container, System));

            ConfigureContainer(Container, _quartzConfig, System);

            Transport             = Container.Resolve <IActorTransport>();
            _quartzScheduler      = Container.Resolve <Quartz.IScheduler>();
            _commandExecutor      = Container.Resolve <ICommandExecutor>();
            _waiterFactory        = Container.Resolve <IMessageWaiterFactory>();
            _commandWaiterFactory = Container.Resolve <ICommandWaiterFactory>();

            EventBusForwarder = System.ActorOf(Props.Create(() => new EventBusForwarder(Transport)), nameof(EventBusForwarder));
            var appInsightsConfig  = Container.Resolve <IAppInsightsConfiguration>();
            var perfCountersConfig = Container.Resolve <IPerformanceCountersConfiguration>();

            var factories = Container.ResolveAll(typeof(IConstructAggregates))
                            .Select(o => new { Type = o.GetType(), Obj = (IConstructAggregates)o })
                            .Where(o => o.Type.IsGenericType && o.Type.GetGenericTypeDefinition() == typeof(AggregateSnapshottingFactory <>))
                            .Select(o => new { AggregateType = o.Type.GetGenericArguments().First(), Constructor = o.Obj })
                            .ToArray();

            foreach (var factory in factories)
            {
                AggregateFromSnapshotsFactory.Register(factory.AggregateType, m => factory.Constructor.Build(factory.GetType(), Guid.Empty, m));
            }

            if (appInsightsConfig.IsEnabled)
            {
                var monitor = new ActorAppInsightsMonitor(appInsightsConfig.Key);
                ActorMonitoringExtension.RegisterMonitor(System, monitor);
            }
            if (perfCountersConfig.IsEnabled)
            {
                ActorMonitoringExtension.RegisterMonitor(System, new ActorPerformanceCountersMonitor());
            }

            _stopping = false;
            _log.Debug("Launching GridDomain node {Id}", Id);

            var props          = System.DI().Props <GridNodeController>();
            var nodeController = System.ActorOf(props, nameof(GridNodeController));

            await nodeController.Ask <GridNodeController.Started>(new GridNodeController.Start
            {
                RoutingActorType = RoutingActorType[_transportMode]
            });

            _log.Debug("GridDomain node {Id} started at home {Home}", Id, System.Settings.Home);
        }
예제 #2
0
        public QuartzJob(IQuartzLogger quartzLogger,
                         IPublisher publisher,
                         IMessageWaiterFactory executor)
        {
            Condition.NotNull(() => quartzLogger);
            Condition.NotNull(() => publisher);

            _executor     = executor;
            _quartzLogger = quartzLogger;
            _publisher    = publisher;
        }
예제 #3
0
        public async Task Start()
        {
            Log.Information("Starting GridDomain node {Id}", Id);

            _stopping             = false;
            EventsAdaptersCatalog = new EventsAdaptersCatalog();
            _containerBuilder     = new ContainerBuilder();

            System = _actorSystemFactory.Create();
            System.RegisterOnTermination(OnSystemTermination);

            System.InitLocalTransportExtension();
            Transport = System.GetTransport();

            _containerBuilder.Register(new GridNodeContainerConfiguration(Transport, Log));
            _waiterFactory = new MessageWaiterFactory(System, Transport, DefaultTimeout);

            Initializing.Invoke(this, this);

            System.InitDomainEventsSerialization(EventsAdaptersCatalog);

            ActorTransportProxy = System.ActorOf(Props.Create(() => new LocalTransportProxyActor()), nameof(ActorTransportProxy));

            //var appInsightsConfig = AppInsightsConfigSection.Default ?? new DefaultAppInsightsConfiguration();
            //var perfCountersConfig = AppInsightsConfigSection.Default ?? new DefaultAppInsightsConfiguration();
            //
            //if(appInsightsConfig.IsEnabled)
            //{
            //    var monitor = new ActorAppInsightsMonitor(appInsightsConfig.Key);
            //    ActorMonitoringExtension.RegisterMonitor(System, monitor);
            //}
            //if(perfCountersConfig.IsEnabled)
            //    ActorMonitoringExtension.RegisterMonitor(System, new ActorPerformanceCountersMonitor());

            _commandExecutor = await CreateCommandExecutor();

            _containerBuilder.RegisterInstance(_commandExecutor);

            var domainBuilder = CreateDomainBuilder();

            domainBuilder.Configure(_containerBuilder);

            Container = _containerBuilder.Build();
            System.AddDependencyResolver(new AutoFacDependencyResolver(Container, System));
            domainBuilder.Configure(Pipe);
            var nodeController = System.ActorOf(Props.Create(() => new GridNodeController(Pipe.CommandExecutor, ActorTransportProxy)), nameof(GridNodeController));

            await nodeController.Ask <GridNodeController.Alive>(GridNodeController.HeartBeat.Instance);

            Log.Information("GridDomain node {Id} started at home {Home}", Id, System.Settings.Home);
        }