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.
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
É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) –
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