2

我想检查 ClusterSharding 是否不是针对一个区域启动的。这是代码:

def someMethod: {
    val system = ActorSystem("ClusterSystem", ConfigFactory.load())
    val region: ActorRef = ClusterSharding(system).shardRegion("someActorName")
}

如果找不到 shardRegion,则方法akka.contrib.pattern.ClusterSharding#shardRegion抛出。IllegalArgumentException我不喜欢IllegalArgumentException仅仅检查 ClusterSharding 没有启动的方法。

是否有另一种方法,例如 ClusterSharding(system).isStarted(shardRegionName = "someActorName")?或者假设我应该在 ActorSystem 启动时启动所有 shardingRegion ?

4

1 回答 1

1

您确实应该尽快启动所有区域。根据文档

“当使用分片扩展时,通常是在集群中每个节点的系统启动时,应该使用 ClusterSharding.start 方法注册支持的条目类型。”

区域的启动不是立即的。特别是,即使在本地情况下,它也至少需要 akka.contrib.cluster.sharding.retry-interval 中指定的时间(这个名字有误导性:这个值既是注册的初始延迟,也是重试间隔) 在分片 Actor 可以有效接收消息之前配置的参数(在此期间发送的消息不会丢失,但要过一段时间才会传递)。

如果您想 100% 确定您的区域已启动,您应该在调用 cluster.start 后让您的一个分片参与者响应识别消息。一旦它回复,您就可以保证您的区域已启动并运行。如果您想阻塞并等待询问未来,您可以使用询问模式。

于 2014-10-28T11:21:20.973 回答