2014-07-04 158 views
0

让我先解释一下我的问题。我是一个存储所有已知ID的存储库。而这个存储库是一个演员,让他叫他repo。我在此演员中定义了GetId(id: Id)消息和GetIdReply(Option[Id]),以便请求特定的ID并在已经存在或不存在的情况下获得回复。我会说很直接。使用scala + akka生成唯一的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是在第一次尝试独特。第二次和所有其他尝试不起作用。 所以我在这里的问题是如何正确构建这样一个函数,将“循环”,直到ID是真正独特的?

Thx!

最佳

回答

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) 
    } 
}