Tôi đang cố triển khai các công việc với thử lại ngữ nghĩa bằng cách sử dụng Akka. Nếu một công nhân thất bại (ném một ngoại lệ) trong công việc của mình, ngoài việc khởi động lại nó, tôi muốn gửi lại công việc mà nó đang làm việc.Giám sát viên Akka tùy chỉnh cơ bản trong Java
Cách tiếp cận tôi đang cố gắng là một người giám sát tùy chỉnh, nhưng tôi không thể yêu cầu công ty khởi động lại nhân viên thất bại. ví dụ. Chạy mã sau với Akka 1.1.3 và bạn sẽ không bao giờ thấy thông báo khởi động lại:
import akka.actor.ActorRef;
import akka.actor.UntypedActor;
import akka.actor.UntypedActorFactory;
import akka.config.Supervision;
import static akka.actor.Actors.actorOf;
import static java.lang.System.out;
public class Supervisor extends UntypedActor {
private ActorRef worker;
public static class Worker extends UntypedActor {
@Override
public void onReceive(Object message) {
throw new RuntimeException("croak");
}
public void preRestart(Object reason) {
out.println("supervisor is restarting me!");
}
public void postRestart(Object reason) {
out.println("supervisor restarted me.");
}
}
public static void main(String[] args) {
ActorRef supervisor = actorOf(new UntypedActorFactory() {
public UntypedActor create() {
return new Supervisor();
}
});
supervisor.start();
supervisor.sendOneWay("job");
}
@Override
public void preStart() {
getContext().setFaultHandler(new Supervision.OneForOneStrategy(
new Class[]{RuntimeException.class},
3,
1000
));
// why doesn't the compiler like this line?
// worker = actorOf(Worker.class);
worker = actorOf(new UntypedActorFactory() {
public UntypedActor create() {
return new Worker();
}
});
getContext().startLink(worker);
}
@Override
public void onReceive(Object message) {
worker.sendOneWay(message);
}
}
Bất kỳ ý tưởng nào tôi đang làm sai?
Cảm ơn!
Cũng đã thử điều khai báo cơ bản nhất mà tôi có thể thử - không may mắn! https://gist.github.com/1147998 – spieden