/// <summary> /// Register a named entity type `ShardRegion` on this node that will run in proxy only mode, i.e.it will /// delegate messages to other `ShardRegion` actors on other nodes, but not host any entity actors itself. /// The <see cref="Sharding.ShardRegion"/> actor for this type can later be retrieved with the /// <see cref="ShardRegion"/> method. /// </summary> /// <param name="typeName">The name of the entity type.</param> /// <param name="role"> /// Specifies that this entity type is located on cluster nodes with a specific role. /// If the role is not specified all nodes in the cluster are used. /// </param> /// <param name="idExtractor"> /// Partial function to extract the entity id and the message to send to the entity from the incoming message, /// if the partial function does not match the message will be `unhandled`, i.e.posted as `Unhandled` messages /// on the event stream /// </param> /// <param name="shardResolver"> /// Function to determine the shard id for an incoming message, only messages that passed the `extractEntityId` will be used /// </param> /// <returns>The actor ref of the <see cref="Sharding.ShardRegion"/> that is to be responsible for the shard.</returns> public async Task <IActorRef> StartProxyAsync(string typeName, string role, IdExtractor idExtractor, ShardResolver shardResolver) { var timeout = _system.Settings.CreationTimeout; var settings = ClusterShardingSettings.Create(_system).WithRole(role); var startMsg = new ClusterShardingGuardian.StartProxy(typeName, settings, idExtractor, shardResolver); var started = await _guardian.Value.Ask <ClusterShardingGuardian.Started>(startMsg, timeout); _regions.TryAdd(typeName, started.ShardRegion); return(started.ShardRegion); }
/// <summary> /// Register a named entity type `ShardRegion` on this node that will run in proxy only mode, i.e.it will /// delegate messages to other `ShardRegion` actors on other nodes, but not host any entity actors itself. /// The <see cref="Sharding.ShardRegion"/> actor for this type can later be retrieved with the /// <see cref="ShardRegion"/> method. /// </summary> /// <param name="typeName">The name of the entity type.</param> /// <param name="role"> /// Specifies that this entity type is located on cluster nodes with a specific role. /// If the role is not specified all nodes in the cluster are used. /// </param> /// <param name="extractEntityId"> /// Partial function to extract the entity id and the message to send to the entity from the incoming message, /// if the partial function does not match the message will be `unhandled`, i.e.posted as `Unhandled` messages /// on the event stream /// </param> /// <param name="extractShardId"> /// Function to determine the shard id for an incoming message, only messages that passed the `extractEntityId` will be used /// </param> /// <returns>The actor ref of the <see cref="Sharding.ShardRegion"/> that is to be responsible for the shard.</returns> public IActorRef StartProxy(string typeName, string role, ExtractEntityId extractEntityId, ExtractShardId extractShardId) { var timeout = _system.Settings.CreationTimeout; var settings = ClusterShardingSettings.Create(_system).WithRole(role); var startMsg = new ClusterShardingGuardian.StartProxy(typeName, settings, extractEntityId, extractShardId); var started = _guardian.Value.Ask <ClusterShardingGuardian.Started>(startMsg, timeout).Result; _regions.TryAdd(typeName, started.ShardRegion); return(started.ShardRegion); }