Scala 参与者与非参与者交互(或将消息从参与者同步到 servlet)

标签 scala servlets synchronization actor future

我有以下 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 的情况下,有什么更优雅的方法可以做到这一点?我想我必须使用 future,但我无法理解这个概念。我需要确保每个HTTP请求得到一个唯一的随机数(当然,随机数只是为了解释问题)。一些提示或引用将不胜感激。

最佳答案

使用:

!! <-- 返回一个你可以等待的 Future

!? <-- 使用有超时的,完全同步是危险的

根据您对 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/api/current/scala/actors/Actor.html

关于Scala 参与者与非参与者交互(或将消息从参与者同步到 servlet),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3397991/

相关文章:

java - HttpSessionListener.sessionCreated() 未被调用

java - 如何从 servlet 发送数组并在 HTML jquery 中接收?

java - 当我运行 scala 应用程序时如何修复 "NoClassDefFoundError: midterm/Main"?

scala - 如何将外部范围的值隐式注入(inject) Scala 特征

java - 在 Rythm 中使用另一个变量设置一个变量

java - 是否可以使用 volatile 变量来实现一致的只写同步?

multithreading - 什么时候需要条件变量,互斥锁还不够吗?

scala - 如何从 DataFrame 中选择案例类中存在的列

java - 尽管完全不使用或引用Hadoop,但Apache Spark运行时异常 “Unable to load native-hadoop library for your platform”

arrays - 同步数组(对于喜欢/关注者)最佳实践 [Firebase Swift]