コード例 #1
0
        public bool TryGet(GrainType grainType, out IGrainContextActivator activator)
        {
            if (!_grainClassMap.TryGetGrainClass(grainType, out var grainClass) ||
                !typeof(Grain).IsAssignableFrom(grainClass))
            {
                activator = null;
                return(false);
            }

            var             sharedComponents  = _sharedComponentsResolver.GetComponents(grainType);
            IGrainActivator instanceActivator = sharedComponents.GetComponent <IGrainActivator>();

            if (instanceActivator is null)
            {
                throw new InvalidOperationException($"Could not find a suitable {nameof(IGrainActivator)} implementation for grain type {grainType}");
            }

            var(activationCollector, collectionAgeLimit) = GetCollectionAgeLimit(grainType, grainClass);

            activator = new ActivationDataActivator(
                instanceActivator,
                _placementStrategyResolver.GetPlacementStrategy(grainType),
                activationCollector,
                collectionAgeLimit,
                _messagingOptions,
                _maxWarningRequestProcessingTime,
                _maxRequestProcessingTime,
                _loggerFactory,
                _serviceProvider,
                _grainRuntime ??= _serviceProvider.GetRequiredService <IGrainRuntime>(),
                _grainReferenceActivator,
                sharedComponents,
                _activationMessageScheduler ??= _serviceProvider.GetRequiredService <ActivationMessageScheduler>());
            return(true);
        }
コード例 #2
0
 public ActivatorEntry(
     IGrainContextActivator activator,
     IConfigureGrainContext[] configureActions)
 {
     this.Activator        = activator;
     this.ConfigureActions = configureActions;
 }
コード例 #3
0
        private ActivatorEntry CreateActivator(GrainType grainType)
        {
            lock (_lockObj)
            {
                if (!_activators.TryGetValue(grainType, out var configuredActivator))
                {
                    IGrainContextActivator unconfiguredActivator = null;
                    foreach (var provider in this._activatorProviders)
                    {
                        if (provider.TryGet(grainType, out unconfiguredActivator))
                        {
                            break;
                        }
                    }

                    if (unconfiguredActivator is null)
                    {
                        throw new InvalidOperationException($"Unable to find an {nameof(IGrainContextActivatorProvider)} for grain type {grainType}");
                    }

                    var properties = _resolver.GetGrainProperties(grainType);
                    List <IConfigureGrainContext> configureActions = new List <IConfigureGrainContext>();
                    foreach (var provider in _configuratorProviders)
                    {
                        if (provider.TryGetConfigurator(grainType, properties, out var configurator))
                        {
                            configureActions.Add(configurator);
                        }
                    }

                    var applicableConfigureActions = configureActions.Count > 0 ? configureActions.ToArray() : Array.Empty <IConfigureGrainContext>();
                    configuredActivator = new ActivatorEntry(unconfiguredActivator, applicableConfigureActions);
                    _activators         = _activators.SetItem(grainType, configuredActivator);
                }

                return(configuredActivator);
            }
        }
コード例 #4
0
        public bool TryGet(GrainType grainType, out IGrainContextActivator activator)
        {
            if (!_grainClassMap.TryGetGrainClass(grainType, out var grainClass) ||
                !typeof(Grain).IsAssignableFrom(grainClass))
            {
                activator = null;
                return(false);
            }

            var sharedContext     = _sharedComponentsResolver.GetComponents(grainType);
            var instanceActivator = sharedContext.GetComponent <IGrainActivator>();

            if (instanceActivator is null)
            {
                throw new InvalidOperationException($"Could not find a suitable {nameof(IGrainActivator)} implementation for grain type {grainType}");
            }

            var innerActivator = new ActivationDataActivator(
                instanceActivator,
                _serviceProvider,
                sharedContext,
                _workItemGroupLogger,
                _activationTaskSchedulerLogger,
                _schedulerStatisticsGroup,
                _schedulingOptions,
                _statisticsOptions);

            if (sharedContext.PlacementStrategy is StatelessWorkerPlacement)
            {
                activator = new StatelessWorkerActivator(sharedContext, innerActivator);
            }
            else
            {
                activator = innerActivator;
            }

            return(true);
        }
コード例 #5
0
 public StatelessWorkerActivator(GrainTypeSharedContext sharedContext, IGrainContextActivator innerActivator)
 {
     _innerActivator = innerActivator;
     _sharedContext  = sharedContext;
 }