在akka actor中,如果消息是异常的话,如何在它们之间以固定的间隔调用相同的时间

时间:2017-02-15 12:45:37

标签: java akka actor akka-http

我有一个实用工具类,我从中调用服务api。如果一切正常,我将得到所需的输出,这是字符串格式。所以成功案例。但是,如果服务器关闭,我可能会发生错误,假设404。在这种情况下,我想调用api假设3次,它们之间间隔1秒。如果在这三次重试中我从Api获得成功,那么我将不会调用api并记录结果,或者如果在3次重试之后它仍然会抛出错误,那么我将不会继续并且只记录错误。 我的实用工具类

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());
}

}

这是演员

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);
    }
  }
}

目标是使用akka actor测试特定api是否正常工作。如果api返回异常,则在每次调用之间使用actor调用该api 3次,间隔1秒。如果经过3次后仍然会出现错误,那么记录错误,如果在重试时我们得到所需的输出然后记录它。

我不知道如何使用akka actor来实现它。如果你知道,请指导我。

1 个答案:

答案 0 :(得分:2)

您可以通过略微修改代码组织来完成您的要求。您的Actor可以更容易地执行所有查询,而不仅仅是失败后的查询。

您首先需要某种方式来表示失败:

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

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

这个类可以是发送给你的Actor的消息类型,它将采取相应的行动:

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   
    }
  }
}

然后,您会要求Actor请求String启动此过程。