2014-07-04 214 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) 
    } 
}