2014-07-04 2 views
0

Laissez-moi d'abord expliquer un peu mon problème. J'ai un référentiel qui stocke tous les ID connus. Et ce référentiel est un acteur, appelez-le repo. J'ai défini GetId(id: Id) message et GetIdReply(Option[Id]) dans cet acteur afin de demander un identifiant spécifique et obtenir une réponse si elle existe déjà ou non. Assez direct je dirais.Utilisation de scala + akka pour générer un identifiant unique

Maintenant, j'ai un autre acteur qui est responsable de la génération d'un ID unique. J'ai donc essayé de mettre en œuvre cette fonction comme:

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 
} 

J'ai essayé de mettre en œuvre cela comme une récursion et cette chose ne fonctionne que si l'identifiant généré est unique sur la première tentative. Sur la deuxième et toutes les autres tentatives, cela ne fonctionne pas. Donc, ma question ici est de savoir comment construire correctement une telle fonction qui "boucle" jusqu'à ce que l'ID soit vraiment unique?

Thx!

Meilleur

Répondre

2

Parce que le résultat dépend de la communication avec un acteur, votre fonction doit retourner un 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) 
    } 
} 
Questions connexes