2010-05-26 57 views
1

我是新来斯卡拉和演员超时。我需要实现这种假设的情况: 服务器等待消息,如果它不得到任何发言权10S一段时间后,它会发送消息到客户端。否则它会收到传入的消息。如果它正在处理一些消息,并且有另一条消息到来,它需要排队(我想这是由scala actors自动完成的)。落实演员

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

回答

6

这个怎么样?

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

2016年阅读我不确定 - 这是关于scala.actors?如果是,它如何转化为akka.actor? – Suma 2016-10-06 10:26:16

+0

@Suma是的,不知道。 – 2016-10-06 19:52:45

1

丹尼尔提供了更好的回答这个问题的无输入条件的一部分。所以我编辑了我的劣质解决方案。

至于问题的延迟响应部,该消息队列不同时演员睡阻塞。它可以睡觉,消息仍然会积累。

但是,如果你想从当您收到一条消息,当您处理到一个固定的延时,你可以,例如,创建一个将立即生效,但对延迟的要求包装了消息的演员:

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

谢谢,这是我一直在寻找。 – Darek 2010-05-28 11:01:54