我有一个实用工具类,我从中调用服务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来实现它。如果你知道,请指导我。
答案 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
启动此过程。