在 akka actor 中,如果消息异常,如何在它们之间以固定间隔调用相同的时间
In akka actor if the message is exception how to call the same for few time with fixed interval between them
我有一个实用程序 class,我从中调用服务 api。如果一切正常,我将获得所需的输出,该输出在字符串 format.So 中,这就是成功案例。但是,如果服务器是 down.In,我可能会收到一个错误假设 404,在这种情况下,我想调用 api 假设 3 次,它们之间的间隔为 1 秒。如果在这三次重试中我从 Api 中获得成功,那么我将不会调用 api 并记录结果,或者如果在 3 次重试后它仍然抛出错误那么我将不会继续并只记录错误.
我的实用程序 class
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);
}
}
}
objective 测试一个特定的 api 是否正在使用 akka actor.If api returns 异常然后调用那个 api 使用 actor 3 次,每次间隔 1 秒 call.If 3 次后我们仍然收到错误然后记录错误,如果在重试时我们得到所需的输出然后记录它。
我不知道如何使用akka实现它actors.Please如果你知道请指导我。
您所要求的可以通过稍微修改您的代码组织来完成。对于您的 Actor 而言,执行所有查询会更容易,而不仅仅是失败后的查询。
您首先需要一些表示失败的方法:
public class RequestFailure {
public String request;
public int count;
public RequestFailure(String r, int c) {
request = r;
count = c;
}
}
此 class 可以是发送给您的 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
启动该过程。
我有一个实用程序 class,我从中调用服务 api。如果一切正常,我将获得所需的输出,该输出在字符串 format.So 中,这就是成功案例。但是,如果服务器是 down.In,我可能会收到一个错误假设 404,在这种情况下,我想调用 api 假设 3 次,它们之间的间隔为 1 秒。如果在这三次重试中我从 Api 中获得成功,那么我将不会调用 api 并记录结果,或者如果在 3 次重试后它仍然抛出错误那么我将不会继续并只记录错误. 我的实用程序 class
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);
}
}
}
objective 测试一个特定的 api 是否正在使用 akka actor.If api returns 异常然后调用那个 api 使用 actor 3 次,每次间隔 1 秒 call.If 3 次后我们仍然收到错误然后记录错误,如果在重试时我们得到所需的输出然后记录它。
我不知道如何使用akka实现它actors.Please如果你知道请指导我。
您所要求的可以通过稍微修改您的代码组织来完成。对于您的 Actor 而言,执行所有查询会更容易,而不仅仅是失败后的查询。
您首先需要一些表示失败的方法:
public class RequestFailure {
public String request;
public int count;
public RequestFailure(String r, int c) {
request = r;
count = c;
}
}
此 class 可以是发送给您的 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
启动该过程。