我想检查ClusterSharding是否开始不是针对一个区域。这是代码:
def someMethod: {
val system = ActorSystem("ClusterSystem", ConfigFactory.load())
val region: ActorRef = ClusterSharding(system).shardRegion("someActorName")
}
方法akka.contrib.pattern.ClusterSharding#shardRegion
如果找不到shardRegion则会抛出IllegalArgumentException
。我不喜欢捕获IllegalArgumentException
只是为了检查ClusterSharding是否没有启动。
是否有其他方法,如ClusterSharding(系统).isStarted(shardRegionName =" someActorName")? 或者假设我应该在ActorSystem启动时启动所有shardingRegion?
答案 0 :(得分:1)
你应该尽快开始所有地区。根据{{3}}:
“当您首先使用分片扩展时,通常是在群集中每个节点上的系统启动时,应该使用ClusterSharding.start方法注册支持的条目类型。”
区域的启动不是立竿见影的。特别是,即使在本地情况下,也至少需要akka.contrib.cluster.sharding.retry-interval中指定的时间(该名称具有误导性:此值既是注册的初始延迟又是重试间隔在分片演员可以有效接收消息之前,您的配置参数(在此期间发送的消息不会丢失,但在一段时间后才会发送)。
如果您想100%确定您的区域已启动,则在调用cluster.start后,您应该让一个分片角色响应docs消息。一旦回复,您就可以确保您所在的地区正常运行。如果您想阻止并等待询问未来,可以使用identify模式。