Questo suona come un'operazione pericolosa in generale, poiché se ci sono messaggi critici, l'attore che li processa potrebbe controllarne e trovarne nessuno, ma prima di uscire potrebbe esserne dato un altro da qualche altro thread.
Se sai per certo che questo non può accadere e non hai bisogno di molti switch di messaggi incredibilmente veloci, probabilmente scriverei un guard-actor che conta e tiene traccia dei messaggi critici ma altrimenti passa solo loro su un altro attore per la gestione.
Se non si desidera farlo, tenere presente che i dettagli degli interni dovrebbero cambiare e potrebbe essere necessario passare attraverso il codice sorgente per Actor, Reactor, MessageQueue, ecc. Per ottenere ciò che tu vuoi. Per ora, qualcosa di simile a questo dovrebbe funzionare (attenzione, non testata):
package scala.actors
package myveryownstuff
trait CriticalActor extends Actor {
def criticalAwaits(p: Any => Boolean) = {
synchronized {
drainSendBuffer(mailbox)
mailbox.get(0)(p).isDefined
}
}
}
Nota che dobbiamo mettere il tratto esteso nel pacchetto scala.actors, perché tutti i meccanismi interni della cassetta postale sono dichiarate private ai scala.actors pacchetto. (Questo è un buon avvertimento che dovresti fare attenzione prima di scherzare con gli interni.) Quindi aggiungiamo un nuovo metodo che accetta una funzione in grado di testare un messaggio critico e cercarlo usando il metodo integrato mailbox.get(n)
che restituisce lo n
messaggio che soddisfa alcuni predicati.
fonte
2010-04-27 14:51:10
Approccio molto interessante –