Akkaを使用して再試行セマンティクスでジョブを実装しようとしています。ワーカーがジョブ中に失敗した(例外をスローした)場合は、ワーカーを再起動するだけでなく、作業していたジョブを再送信したいと思います。
私が試しているアプローチはカスタムスーパーバイザーですが、失敗したときにワーカーを再起動させることはできません。たとえば、Akka 1.1.3で次のコードを実行すると、再起動メッセージは表示されません。
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);
}
}
私が間違っていることについて何か考えはありますか?
ありがとう!