2010-05-26 6 views
1

Je suis nouveau à scala et les acteurs. J'ai besoin de mettre en œuvre une telle situation hypothétique: serveur attendre des messages, si elle ne reçoit pas dans 10s période de temps, il envoie un message au client. Sinon, il reçoit les messages entrants. Si c'est à l'intérieur du traitement qu'un message arrive et qu'un autre message arrive, il doit être mis en file d'attente (je suppose que c'est fait automatiquement par les acteurs de scala).Implémenter le délai d'attente dans les acteurs

Le deuxième problème que je rencontre est le sommeil. J'ai besoin de l'acteur pour dormir pendant une période de temps constante quand il reçoit le message. Mais d'un autre côté, je ne peux pas bloquer, car je veux que les messages entrants soient mis en file d'attente pour un traitement ultérieur.

Répondre

6

Comment cela?

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

En lisant ceci en 2016, je ne suis pas sûr - il s'agit de scala.actors? Si c'est le cas, comment cela se traduit-il en akka.actor? – Suma

+0

@Suma Oui, et aucune idée. –

1

Daniel a fourni une meilleure réponse à la partie de la question sans entrée. J'ai donc édité ma solution inférieure. En ce qui concerne la partie réponse différée de la question, la file d'attente des messages ne se bloque pas lorsqu'un acteur dort. Il peut juste dormir et les messages s'accumuleront toujours.

Cependant, si vous voulez un retard fixe à partir lorsque vous recevez un message lorsque vous traitez, vous pouvez, par exemple, créer un acteur qui fonctionne immédiatement, mais enveloppe le message dans une demande de délai:

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

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

Ensuite, l'acteur de travail serait

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

Merci, c'est ce que je cherchais. – Darek

Questions connexes