使用scala + akka生成唯一ID

时间:2014-07-04 04:34:30

标签: scala loops recursion akka future

首先让我解释一下我的问题。我有一个存储库,存储所有已知的ID。这个存储库是一个演员,让他叫他repo。我在此actor中定义了GetId(id: Id)消息和GetIdReply(Option[Id]),以便请求特定的id并获得回复(如果它已经存在或没有)。我很直接地说。

现在我有另一个负责生成唯一ID的actor。所以我尝试实现这个功能,如:

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是唯一的时候,此功能才有效。在第二次和所有其他尝试中,它不起作用。 所以我的问题是如何正确构建这样一个函数,它将循环#34;直到ID真的很独特?

THX!

最佳

1 个答案:

答案 0 :(得分:2)

因为您的结果取决于与演员的沟通,所以您的函数必须返回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)
  }
}