首先让我解释一下我的问题。我有一个存储所有已知ID的存储库。这个仓库是一个演员,叫他repo
。我定义了GetId(id: Id)
消息,并GetIdReply(Option[Id])
在此actor中定义了消息,以便请求特定的ID,并在消息已经存在或不存在时得到答复。我会说很简单。
现在,我有另一个演员负责生成唯一的ID。因此,我尝试实现此功能,例如:
private def getUniqueId(): Id = {
implicit val timeout = Timeout(500.millis)
var id = Id(UUID.randomUUID().toString)
val getIdReply = repo ? GetId(Id)
getIdReply.mapTo[GetIdReply] onSuccess {
case success =>
success.id match {
case Some(matchedId) =>
// Generated ID already exists, let's call this function recursively
id = getUniqueId
case None =>
// Generated ID is OK
}
}
id
}
我尝试将其实现为递归,并且只有在首次尝试生成的ID是唯一的情况下,此功能才有效。在第二次及所有其他尝试中,它不起作用。因此,我的问题是如何正确构造这样的函数,该函数将“循环”直到ID真正唯一?
谢谢!
最好
由于您的结果取决于与参与者的交流,因此您的函数必须返回Future
:
private def getUniqueId(): Future[Id] = {
implicit val timeout = Timeout(500.millis)
val id = Id(UUID.randomUUID().toString)
repo ? GetId(id) flatMap {
case GetIdReply(Some(_)) => getUniqueId()
case GetIdReply(None) => Future.successful(id)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句