2012-02-22 4 views
5

Un'istanza Akka-2 deve rimanere in un ciclo infinito e controllare ogni 10 minuti per l'elaborazione dei dati.Effettuare un'istanza Akka-2 inviare esso stesso un messaggio ogni n TimeUnits senza sovraccaricare la casella postale

Come si progetta il ciclo in modo che l'istanza si richiami, controlli il lavoro da eseguire e quindi dorme per un intervallo?

Inoltre, vedo che non è più possibile interrogare la dimensione della casella di posta. Come ci si assicura che i messaggi vengano ignorati finché l'attività di lavoro (in questo caso la funzione di invio) è attiva?

case class Dispatch() 

// Automatical start? The start function has been removed since Akka 2 ? 
val dispatcher = system.actorOf(Props[MailDispatcher]) 

class MailDispatcher extends Actor { 

    private val interval = Config.getLong("mail.check.interval") 
    context.setReceiveTimeout(Duration(interval, TimeUnit.SECONDS)) 

    def receive = { 
    case ReceiveTimeout => { 
     self ! Dispatch   
    } 
    case Dispatch => dispatch() 
    case e: Exception => Logger.error("unexpected Error: " + e) 
    } 

    def dispatch() {  
     // trigger mail-dispatch  
    } 
} 
+0

Considerando la domanda nel tuo commento: Sì, Akka 2 ha rimosso il metodo di avvio e avvia gli attori alla creazione. Vedi http://akka.io/docs/akka/2.0-RC1/scala/actors.html#creating-actors-with-default-constructor – Frank

risposta

3

Io suggerirei il seguente:

uso: http://akka.io/docs/akka/2.0-RC2/scala/actors.html#initial-receive-timeout

Poi, quando si riceve un messaggio ReceiveTimeout, si sondaggio per il lavoro, e inviare il lavoro alla propria casella di posta.

+0

Grazie per il suggerimento, ho modificato il codice sopra, ma mi chiedo ancora se il è necessaria la chiamata a Thread.sleep? Come viene calcolato il timeout? La chiamata al calcolo del timeout del blocco funzione dispatch? Se il thread rimane inattivo per un anno, la casella di posta verrà sovrasfruttata o il valore di timeout calcolato solo mentre il thread NON sta dormendo? Se non sta dormendo, la chiamata a dormire non è necessaria, immagino. – recalcitrant

+3

NON eseguire Thread.sleep (..) nel tuo attore. Per qualsiasi ragione. Non farlo. –

+0

Ok, grazie ancora. Se il lavoro consuma sempre più tempo del timeout, la casella di posta si riempirà, giusto? C'è qualche documentazione su come evitarlo? – recalcitrant