2010-05-26 97 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