2014-05-08 17 views
5

sto guardando oltre la documentazione Akka Java su attori senza tipo (http://doc.akka.io/docs/akka/2.3.2/java/untyped-actors.html)Akka Java setReceiveTimeout utilizzo

ho effettivamente voglio realizzare qualcosa come:

Impostare un timeout per ogni messaggio particolare, mi aspetto di ricevere nel mio metodo onReceive(). Ad esempio:

public void onReceive(Object message) throws Exception { 

    if (message.equals("start")) { 
     child.tell("fetch something for me!", getSelf()); 
    } 

    if (message.equals("child's response")) { 
     // handle a response from a child here, 
     // but timeout within some timeframe if I don't get a 
     // response quick enough. 
     // use this here? getContext().setReceiveTimeout(Duration.create("1 second")); 
    } 
} 

Capisco che è possibile utilizzare Patterns.ask (attore, messaggio, timeout), che restituisce un futuro. Se la risposta non viene restituita entro l'argomento di timeout specificato, fallire.

Non voglio usare i futures qui. Non capisco l'utilizzo del metodo setReceiveTimeout. Come faccio a realizzare questo semplicemente usando actor.tell?

risposta

7

È necessario impostare il timeout di ricezione immediatamente dopo aver eseguito lo tell sull'altro attore. Una volta fatto, un orologio inizia fondamentalmente a spuntare. Se questo attore non riceve alcun messaggio nella sua casella di posta entro quel periodo di tempo, un messaggio ReceiveTimeout verrà inserito nella cassetta postale indicando che non hai ricevuto una risposta in tempo. Una versione aggiornata del codice per tenere conto di questo sarebbe un aspetto simile:

public void onReceive(Object message) throws Exception { 

    if (message.equals("start")) { 
     child.tell("fetch something for me!", getSelf()); 
     getContext().setReceiveTimeout(Duration.create("1 second")); 
    } 

    else if (message.equals("child's response")) { 
     getContext().setReceiveTimeout(Duration.Undefined()); //turn off receive timeout 
     // handle a response from a child here 
    } 

    else if (message instanceof ReceiveTimeout) { 
     getContext().setReceiveTimeout(Duration.Undefined()); //turn off receive timeout 
     // handle situation where I did not get a response in time 
    } 
} 

Noterete che se ricevo una risposta reale o ottengo un timeout ricezione, sono sempre di spegnere il timeout ricezione I impostato dopo tell. Il timeout di ricezione si ripete; se non lo spengo esplicitamente, continuerà a inviarmi i messaggi ReceiveTimeout ogni intervallo (in base a ciò a cui imposto l'intervallo quando imposto il timeout di ricezione).

Assicurarsi di tenere presente che la funzionalità di timeout di ricezione è un messaggio specifico. Cioè viene saltato per un intervallo a condizione che ricevo il messaggio qualsiasi nella mia casella di posta; non solo quello che voglio. Quindi se qualche altro attore mi ha mandato un altro messaggio completamente diverso, salterà il timeout di ricezione per quell'intervallo. Se questo non sarà un problema, non c'è bisogno di preoccuparsene. Ma se è possibile che altri messaggi oltre alla risposta stiano arrivando, sarà necessario gestirli di conseguenza, reimpostando il timeout di ricezione originale in base a quanto tempo è trascorso dalla sua impostazione iniziale (probabilmente tramite un'istanza