在actor中实现超时

时间:2010-05-26 14:17:36

标签: scala actor

我是scala和演员的新手。我需要实现这样的假设情况: 服务器等待消息,如果在10秒内没有得到任何消息,它会向客户端发送消息。否则它会收到传入的消息。如果它在内部处理一些消息并且另一条消息到来,则需要排队(我想这是由scala actor自动完成的)。

我遇到的第二个问题是睡觉。当接收到消息时,我需要演员睡一段时间。但另一方面,我无法阻止,因为我希望传入的消息排队等待进一步处理。

2 个答案:

答案 0 :(得分:6)

这个怎么样?

loop {
  reactWithin(10000) {
    case TIMEOUT => // send message to client
    case work => // do work
  }
}

答案 1 :(得分:1)

丹尼尔为问题的无输入条件部分提供了更好的答案。所以我已经删掉了我的劣质解决方案。

对于问题的延迟响应部分,当演员睡觉时,消息队列不会阻塞。它只能睡觉,消息仍会累积。

但是,如果您希望从接收消息到处理消息时有一个固定的延迟,例如,您可以创建一个立即工作的actor,但在请求延迟时将消息包装起来:

case class Delay(when: Long, what: Any) { }

// Inside class DelayingActor(workingActor: Actor)
case msg => workingActor ! Delay(delayValue + System.currentTimeMillis , msg)

然后,工作演员

case Delay(t,msg) =>
  val t0 = System.currentTimeMillis
  if (t>t0) Thread.sleep( t - t0 )
  msg match {
    // Handle message
  }