2010-08-03 5 views
2

I ont le code scala suivant:acteur Scala à une interaction non-acteur (ou messages de synchronisation à partir d'un acteur à une servlet)

package dummy 
    import javax.servlet.http.{HttpServlet, 
    HttpServletRequest => HSReq, HttpServletResponse => HSResp} 
    import scala.actors.Actor 

    class DummyServlet extends HttpServlet { 
    RNG.start 
    override def doGet(req: HSReq, resp: HSResp) = { 
     def message = <HTML><HEAD><TITLE>RandomNumber </TITLE></HEAD><BODY> 
      Random number = {getRandom}</BODY></HTML> 
     resp.getWriter().print(message) 
     def getRandom: String = {var d = new DummyActor;d.start;d.getRandom} 
    } 
    class DummyActor extends Actor { 
     var result = "0" 
     def act = { RNG ! GetRandom 
     react { case (r:Int) => result = r.toString } 
     } 
     def getRandom:String = { 
     Thread.sleep(300) 
     result 
     } 
    } 
    } 

    // below code is not modifiable. I am using it as a library 
    case object GetRandom 
    object RNG extends Actor { 
    def act{loop{react{case GetRandom=>sender!scala.util.Random.nextInt}}} 
    } 

Dans le code ci-dessus, j'utiliser thread.sleep pour assurer qu'il y a suffisamment de temps pour que result soit mis à jour, sinon 0 est renvoyé. Quelle est une manière plus élégante de faire ceci sans utiliser thread.sleep? Je pense que je dois utiliser des contrats à terme, mais je n'arrive pas à comprendre le concept. Je dois m'assurer que chaque résultat HTTP obtient un nombre aléatoire unique (bien sûr, le nombre aléatoire est juste pour expliquer le problème). Quelques indices ou références seraient appréciés.

Répondre

3

L'une ou l'autre utilisation:

!! < - Retourne un avenir que vous pouvez attendre

ou

! < - Utilisez celui avec un délai d'attente, le totalement synchrone est dangereux

Compte tenu de votre définition de RNG, voici un code REPL pour vérifier:

scala> def foo = { println(RNG.!?(1000,GetRandom)) } 
foo: Unit 

scala> foo 
Some(-1025916420) 

scala> foo 
Some(-1689041124) 

scala> foo 
Some(-1633665186) 

Docs sont ici: http://www.scala-lang.org/api/current/scala/actors/Actor.html

+0

est une bonne idée, sauf pour utiliser !! ou !? au lieu de ! dans le code ci-dessus, j'ai besoin de modifier l'objet RNG (c'est-à-dire, ajouter une déclaration de réponse quelque part). Au moins, c'est comme ça que je l'ai compris. Cependant, je ne suis pas autorisé à modifier cet objet. – Jus12

+0

Étant donné votre définition de RNG cela fonctionne très bien: scala> def foo = foo {println (RNG (1000, GetRandom).!?)}: Unité scala> foo Certains (-1025916420) scala > foo Certains (-1689041124) scala> foo Certains (-1633665186) –

+0

Ceci est assez intéressant. J'avais lu que l'acteur récepteur (c'est-à-dire, 'RNG') doit répondre en utilisant' reply (message) 'au lieu d'utiliser' sender! message' pour que '!?' fonctionne. Cependant, cela fonctionne aussi de cette façon dans mon code. Est-ce que c'est quelque chose d'attendu? Merci pour le conseil, BTW. – Jus12

Questions connexes