2017-02-15 1 views
2

J'ai une classe d'utilité à partir de laquelle j'appelle un service api. Si tout va bien j'obtiendrai la sortie désirée qui est dans le format de chaîne. Ainsi c'est le cas de succès. Mais il peut arriver que j'obtiens une erreur supposer 404 si le serveur est en panne. Dans de tels cas, je veux appeler cette API pour supposer 3 fois avec 1 seconde d'intervalle entre eux. Si dans ces trois tentatives j'obtiens le succès de l'Api alors je ne calmerai pas l'api et n'inscrirai pas le résultat, Ou si après 3 tentatives il jette toujours l'erreur alors je ne continuerai pas et juste noterai l'erreur. ma classe utilitaireDans l'acteur akka si le message est l'exception comment appeler le même pour peu de temps avec intervalle fixe entre eux

public class Utils { 

public void doOperation(String service_Url) throws Exception { 
    Object message= someFunction(service_Url);//this function is calling the service api 
    final ActorSystem system = ActorSystem.create("helloakka"); 
    final ActorRef akkaBot=system.actorOf(Props.create(MyUntypedActor.class), "akkaBot"); 
    akkaBot.tell(message, ActorRef.noSender()); 
} 

} 

Voici l'acteur

public class MyUntypedActor extends UntypedActor { 
    @Override 
    public void onReceive(Object message) { 
    if (message instanceof HTTPException) { 
     System.out.println(message); 
     //Here as it got exception.I want to call the actor 3 times with 1 second interval between them 
    } 
else if (message instanceof String) { 
     System.out.println(message); 
     getSender().tell(value, getSelf()); 
    } 
else { 
     unhandled(message); 
    } 
    } 
} 

L'objectif est de tester un api particulier fonctionne ou ne pas utiliser akka actor.If l'api retourne exception alors appel que api en utilisant 3 fois acteur avec un intervalle de 1 sec entre chaque appel.Si après 3 fois nous recevons toujours l'erreur, puis enregistrer l'erreur, si en réessayant, nous obtenons la sortie désirée puis enregistrez-le.

Je ne sais pas comment y parvenir en utilisant des acteurs Akka.Veuillez me guider si vous le savez.

Répondre

2

Ce que vous demandez peut être accompli avec une légère modification de l'organisation de votre code. Il serait plus facile pour votre acteur d'effectuer toutes les requêtes plutôt que seulement les requêtes consécutives à un échec.

Vous allez tout d'abord besoin d'un moyen de représenter les échecs:

public class RequestFailure { 
    public String request; 
    public int count; 

    public RequestFailure(String r, int c) { 
    request = r; 
    count = c; 
    } 
} 

Cette classe peut alors être un type de message envoyé à votre acteur qui agira en conséquence:

public class MyUntypedActor extends UntypedActor { 
    public void onReceive(Object message) { 
    if(message instanceOf String) { 
     Object response = someFunction((String) message); 
     if(response instanceOf HTTPException) { 
     Thread.sleep(1000); 
     getSelf().tell(new RequestFailure((String) message, 1), getSender()); 
     } 
     else 
     getSender().tell(response, getSelf()) 
    } 
    else if(message instanceOf RequestFailure) { 
     RequestFailure rf = (RequestFailure) message; 
     if(rf.count <= 3) { 
     Object response = someFunction(rf.request); 
     if(response instanceOf HTTPException) { 
      Thread.sleep(1000); 
      getSelf().tell(new RequestFailure(rf.request, rf.count + 1), getSender(); 
     } 
     else 
      getSender().tell(response, getSelf()) 
     } 
     } 
     else 
     //FIXME : question doesn't specify what to return 
     //  if max count reached 
    } 
    } 
} 

alors vous Demander le Actor avec une demande String pour démarrer le processus.

+1

si son succès pour la première fois, il fonctionne comme souhaité.Mais si à la première tentative c'est une erreur, puis il crée l'objet RequestFailure et appelle la deuxième fois en utilisant rf.request.Si la deuxième fois (ou dans toute tentative) son succès n'est alors pas une instance d'exception donc 'getSender(). tell (response, getSelf());' est exécuté. Mais ici ce qui se passe est 'public void onReceive (objet message) {' méthode de 'class MyUntypedActor' reçoit la réponse ce que' getSender(). Tell' envoie et l'acteur est exécuté encore et encore.same se passe quand count > 3 et envoyez sendSender() @Ramon J –

+2

@MithunDebnath Réponse mise à jour. Je référence le 'MyUntypedActor' comme l'expéditeur de la demande d'origine au lieu de l'expéditeur réel. Faites-moi savoir si vous voyez d'autres problèmes ... –

+1

Je vais tester le code demain car je n'ai pas l'application avec moi en ce moment.Une chose que j'ai remarquée, mais j'ai oublié de vous demander.'if (rf.count < = 3) {Object response = someFunction (rf.request); 'ici si' if (réponse instanceOf HTTPException) {'alors vous avez écrit' getSelf(). Tell (nouveau message RequestFailure ((String), rf.count + 1), getSender(); 'ne devrait pas être' getSelf(). tell (nouveau RequestFailure ((String) rf.request, rf.count + 1), getSender(); 'Une autre chose est si count atteint max nombre je veux envoyer l'expéditeur réel l'information que «nombre maximum atteint» .De qui d'autre je l'envoie? @ Ramon –