1
votes

Exemple de modèle de demande dans akka tapé

J'essaie de comprendre comment le modèle de demande fonctionne. Dans la documentation, il est dit:

Effectuer une seule interaction de message demande-réponse avec un autre acteur, et retransformez les messages au protocole de cet acteur.

L'interaction a un délai d'expiration (pour éviter une fuite de ressources). Si la timeout frappe sans aucune réponse, il sera passé comme un Échec (java.util.concurrent.TimeoutException) à la mapResponse fonction (c'est la seule manière «normale» de transmettre un échec au fonction).

Pour d'autres modèles de messagerie avec d'autres acteurs, voir ActorContext # messageAdapter.

Cette méthode est thread-safe et peut être appelée à partir d'autres threads que le fil de traitement de message d'acteur ordinaire, tel que rappels scala.concurrent.Future.

Quelqu'un pourrait-il donner un exemple pour mieux comprendre le modèle de demande.


0 commentaires

3 Réponses :


0
votes

La question que vous avez posée est liée à l'API typé akka et l'API ask pattern est légèrement différente de l'akka standard (non typée).

Les exemples peuvent être trouvés sur akka docs et il est répliqué ici

trait CookieCommand {}
case class GiveMeCookies(replyTo: ActorRef[Cookies]) extends CookieCommand
case class Cookies(count: Int)

import akka.actor.typed.scaladsl.AskPattern._

// asking someone requires a timeout and a scheduler, if the timeout hits without response
// the ask is failed with a TimeoutException
implicit val timeout: Timeout = 3.seconds
implicit val scheduler = system.scheduler

val result: Future[Cookies] = cookieActorRef.ask(ref => GiveMeCookies(ref))

// the response callback will be executed on this execution context
implicit val ec = system.executionContext

result.onComplete {
  case Success(cookies) => println("Yay, cookies!")
  case Failure(ex)      => println("Boo! didn't get cookies in time.")
}


0 commentaires

1
votes

Le «modèle Ask» est utilisé dans le code en dehors des acteurs pour communiquer avec les acteurs. Akka créera un acteur pour vous dans les coulisses, enverra un message et attendra une réponse dans le délai imparti. Rien de tout cela ne bloquera votre thread car un résultat Future sera renvoyé immédiatement et devrait contenir une réponse plus tard. Cela est nécessaire car les acteurs ne peuvent communiquer qu'en envoyant des messages et si vous n'êtes pas au sein d'un acteur, vous ne pouvez pas recevoir de message. Il est recommandé d'utiliser 'tell' ! au lieu de 'ask' ? car c'est plus efficace mais parfois il n'y a pas de choix donc vous devez relier deux mondes avec 'ask' .

Recherchez des exemples sur Internet ou essayez d'appeler des acteurs à partir de la méthode main pour en avoir une idée.


0 commentaires

2
votes

Lorsque vous avez besoin d'interagir avec un autre acteur et que vous dépendez également de sa réponse, vous pouvez utiliser la méthode tell pour envoyer un message et attendre un nouveau message de réponse (déclencher et oublier). Étant donné qu'Akka n'a pas de livraison garantie, vous pouvez attendre indéfiniment si l'acteur destinataire est en panne.
Ask renvoie une Future [Response] qui est soit terminée avec une réponse réussie, soit a échoué avec une TimeoutException s'il n'y a pas eu de réponse dans le délai spécifié.
Veuillez consulter l ' exemple < / p>


1 commentaires

"En raison du fait qu'Akka n'a pas de livraison garantie, vous pourriez attendre indéfiniment si l'acteur destinataire est arrêté." Ou, plus probablement, en raison du fait que la réponse n'était tout simplement pas prête, ou même d'un bogue de codage, le message de réponse n'a même jamais été envoyé. Je ne peux pas tout reprocher au service postal ...