Scala взаимодействие актера с неактором (или синхронизация сообщений от актера к сервлету) - PullRequest
2 голосов
/ 03 августа 2010

У меня есть следующий код scala:

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

В приведенном выше коде я должен использовать thread.sleep, чтобы обеспечить достаточно времени для обновления result, в противном случае 0возвращаетсяКаков более элегантный способ сделать это без использования thread.sleep?Я думаю, что я должен использовать фьючерсы, но я не могу разобраться в концепции.Мне нужно убедиться, что каждый запрос HTTP получает уникальное случайное число (конечно, случайное число просто для объяснения проблемы).Некоторые советы или ссылки будут оценены.

1 Ответ

3 голосов
/ 03 августа 2010

Либо использовать:

!!<- возвращает будущее, которое вы можете ждать </p>

или

!?<- Используйте тот, у которого есть тайм-аут, полностью синхронно опасно </p>

Учитывая ваше определение RNG, вот некоторый код REPL для проверки:

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

scala> foo
Some(-1025916420)

scala> foo
Some(-1689041124)

scala> foo
Some(-1633665186)

Документы здесь: http://www.scala -lang.org / апи / ток / Скала / актеры / Actor.html

...