【问题标题】:Basic Custom Akka Supervisor in JavaJava 中的基本自定义 Akka 主管
【发布时间】:2011-08-15 19:55:22
【问题描述】:

我正在尝试使用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);
      }
  }

知道我做错了什么吗?

谢谢!

【问题讨论】:

标签: java akka


【解决方案1】:

这些是Workeractor 中重启方法的正确签名:

    @Override
    public void preRestart(Throwable reason) {
        out.println("supervisor is restarting me!");
    }

    @Override
    public void postRestart(Throwable reason) {
        out.println("supervisor restarted me.");
    }

而且我没有收到注释行的任何编译错误。

【讨论】:

  • 好的,做到了,还解释了为什么我的声明性示例不起作用。出于某种原因,我的 IDE 抱怨新签名不会覆盖基类中的方法,而带有 Object 的原始签名会。我猜 IntelliJ 中存在某种 Java / Scala 互操作问题。谢谢!
  • @dacc 在 IntelliJ 10.5 中也注意到了这一点
猜你喜欢
  • 1970-01-01
  • 2016-05-23
  • 2016-06-18
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
相关资源
最近更新 更多