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); }
public ActivatorEntry( IGrainContextActivator activator, IConfigureGrainContext[] configureActions) { this.Activator = activator; this.ConfigureActions = configureActions; }
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); } }
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); }
public StatelessWorkerActivator(GrainTypeSharedContext sharedContext, IGrainContextActivator innerActivator) { _innerActivator = innerActivator; _sharedContext = sharedContext; }