我是 scala 和演员的新手。我需要实现这样的假设情况:服务器等待消息,如果在 10 秒内没有收到任何消息,它会向客户端发送消息。否则它会收到传入的消息。如果它在内部处理一些消息并且另一个消息来了,它需要排队(我想这是由 scala 演员自动完成的)。
我遇到的第二个问题是睡眠。我需要演员在收到消息时保持一段时间的睡眠。但另一方面,我无法阻止,因为我希望传入消息排队等待进一步处理。
这个怎么样?
loop {
reactWithin(10000) {
case TIMEOUT => // send message to client
case work => // do work
}
}
Daniel 对问题的无输入条件部分提供了更好的答案。所以我编辑了我的劣质解决方案。
至于问题的延迟响应部分,消息队列在参与者睡觉时不会阻塞。它可以只是休眠,消息仍然会累积。
但是,如果您想要从收到消息到处理消息的固定延迟,例如,您可以创建一个立即工作但将消息包装在延迟请求中的参与者:
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
}