¿Es posible hacer un Actor
espera X cantidad de segundos para recibir cualquier mensaje, y si se recibe un mensaje, trátelo como de costumbre, de lo contrario, envíe un mensaje a algún otro Actor
(predeterminado en el constructor)?Akka Actor - espera algún tiempo para esperar un mensaje, de lo contrario envía un mensaje
Respuesta
Sí, si desea esperar a que ningún mensaje, sólo tiene que establecer un ReceiveTimeout: http://doc.akka.io/docs/akka/current/scala/actors.html#receive-timeout
(Los documentos es ligeramente engañoso aquí, puede configurar el receiveTimeout después de cada mensaje también)
Es posible, eche un vistazo a Akka Actor "ask" and "Await" with TimeoutException. Pero tenga en cuenta que bloquear dentro de un actor es una muy mala idea ya que durante ese tiempo el actor no puede manejar ningún otro mensaje. Además, bloquea un hilo de procesamiento Akka.
Un mejor enfoque es enviar un mensaje (fuego y olvidar) y programar algún evento de tiempo de espera usando Akka scheduler. Cuando llegue la respuesta, cancele ese evento o establezca un indicador para que no se active si la respuesta llegó a tiempo.
Podría ser una exageración, pero podría verificar el rasgo Finite State Machine (FSM).
import akka._
import actor._
import util._
import duration._
import Impatient._
object Impatient {
sealed trait State
case object WaitingForMessage extends State
case object MessageReceived extends State
case object TimeoutExpired extends State
sealed trait Data
case object Unitialized extends Data
// In
case object Message
}
class Impatient(receiver: ActorRef) extends Actor with FSM[State, Data] {
startWith(WaitingForMessage, Unitialized)
when(WaitingForMessage, stateTimeout = 3 seconds) {
case Event(StateTimeout, data) => goto(TimeoutExpired) using data // data is usually modified here
case Event(Message, data) => goto(MessageReceived) using data // data is usually modified here
}
onTransition {
case WaitingForMessage -> MessageReceived => stateData match {
case data => log.info("Received message: " + data)
}
case WaitingForMessage -> TimeoutExpired => receiver ! TimeoutExpired
}
when(MessageReceived) {
case _ => stay
}
when(TimeoutExpired) {
case _ => stay
}
initialize
}
Aquí está en acción:
object Main extends App {
import akka._
import actor._
import Impatient._
val system = ActorSystem("System")
val receiver = system.actorOf(Props(new Actor with ActorLogging {
def receive = {
case TimeoutExpired => log.warning("Timeout expired")
}
}))
val impatient = system.actorOf(Props(new Impatient(receiver)), name = "Impatient")
impatient ! Message
val impatient2 = system.actorOf(Props(new Impatient(receiver)), name = "Impatient2")
Thread.sleep(4000)
impatient2 ! Message
system.shutdown()
}
- 1. mensaje de error con Scala AKKA Actor
- 2. RabbitMQ Espere un mensaje con un tiempo de espera
- 3. Espere un solo mensaje RabbitMQ con un tiempo de espera
- 4. ¿Cómo se espera que termine el sistema Akka actor?
- 5. Comprobando si Akka actor remoto está disponible
- 6. ¿Cómo puede un actor akka interactuar entre hilos?
- 7. Manejar Akka buzón delimitado por el actor MessageQueueAppendFailedException
- 8. Akka - ¿Cuántas instancias de un actor debería crear?
- 9. ¿Cómo puedo activar adecuadamente a un actor temporal en Akka?
- 10. Esperar a que salga un actor()
- 11. El bus GStreamer envía Ninguno mensaje
- 12. Espera de forma sincrónica para el mensaje en Web-Worker
- 13. Hacer que una instancia de Akka-2 se envíe un mensaje cada n unidades de tiempo sin desbordar el buzón
- 14. Cuerpo del mensaje en un mensaje 404
- 15. ¿Cómo esperar en WaitHandle sin mensaje de bombeo?
- 16. Descubrimiento de servidor de actor remoto Akka
- 17. Usar singletons en akka scala actor
- 18. Lo contrario de assert_select?
- 19. No se envía el mensaje de la bandeja de salida
- 20. Lo contrario de instanceof
- 21. CQRS: ¿cuándo enviar un mensaje de confirmación?
- 22. cómo obtener el tamaño de la cola de mensajes de un actor de Akka?
- 23. Ejemplo de Akka EventBus para Java
- 24. log4net: ¿algún filtro para registrar solo el enésimo mensaje?
- 25. ThunderBird Evento para ver un mensaje
- 26. Protobuf: anidando un mensaje de tipo arbitrario
- 27. Akka Actor "preguntar" y "aguardan" con TimeoutException
- 28. java- cómo esperar constantemente para que ocurra un evento
- 29. ¿Cómo encriptar un mensaje para múltiples destinatarios?
- 30. Oracle: procedimiento almacenado Java que envía mensaje JMS
+1 para el horario r solución. – paradigmatic