2012-02-22 7 views
5

Una instancia de Akka-2 debe permanecer en un bucle infinito y verificar cada 10 minutos para que los datos se procesen.Hacer que una instancia de Akka-2 se envíe un mensaje cada n unidades de tiempo sin desbordar el buzón

¿Cómo diseño el ciclo para que la instancia se llame a sí misma, compruebe que el trabajo se realiza y luego duerme durante un intervalo?

También veo que ya no se puede consultar el tamaño del buzón. ¿Cómo se asegura de que los mensajes se ignoren siempre que la tarea de trabajo (en este caso, la función de envío) esté activa?

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 pregunta en tu comentario: Sí, Akka 2 ha eliminado el método de inicio y comienza a crear actores. Ver http://akka.io/docs/akka/2.0-RC1/scala/actors.html#creating-actors-with-default-constructor – Frank

Respuesta

3

me gustaría sugerir lo siguiente:

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

Entonces, cuando llegue un mensaje ReceiveTimeout, que la encuesta en el trabajo y enviar el trabajo a su propio buzón.

+0

Gracias por la sugerencia, he editado el código anterior pero aún me pregunto si el llamar a Thread.sleep es necesario en absoluto? ¿Cómo se calcula el tiempo de espera? ¿La llamada a la función de despacho bloquea el cálculo del tiempo de espera? Si el hilo duerme durante un año, ¿se desbordará el buzón o se calculará el valor de tiempo de espera solo mientras el hilo NO esté durmiendo? Si no está durmiendo, la llamada a dormir es innecesaria, supongo. – recalcitrant

+3

NUNCA haga Thread.sleep (..) en su Actor. Por alguna razon. Simplemente no lo hagas –

+0

Ok, gracias de nuevo. Si el trabajo siempre consume más tiempo que el tiempo de espera, el buzón eventualmente se llenará, ¿verdad? ¿Hay alguna documentación sobre cómo evitar eso? – recalcitrant

Cuestiones relacionadas