Подтвердить что ты не робот

Решение для "UntypedActor" устарело в учебнике Akka (Java)

Исходный код

Учебник Akka имеет следующий код: http://doc.akka.io/docs/akka/2.0.2/intro/getting-started-first-java.html

public void calculate (final int nrOfWorkers, final int nrOfElements, final int nrOfMessages){
    ActorSystem system = ActorSystem.create("PiSystem");
    final ActorRef listener = system.actorOf(Props.create(Listener.class), "listener");
    ActorRef master = system.actorOf(new Props(new UntypedActorFactory() {
            public UntypedActor create() {
                return new Master(nrOfWorkers, nrOfMessages, nrOfElements, listener);
            }
    }), "master");
    master.tell(new Calculate(), ActorRef.noSender());
}

в котором UntypedActorFactory устарел.

Мой мод

Поэтому я попытался использовать Props.create, например

ActorRef master = system.actorOf( Props.create(
            new Creator<Master>(){
                public Master create(){
                    return new Master(nrOfWorkers, nrOfMessages, nrOfElements, listener);
            }
    }), "master");

И есть сообщение об исключении

не может использовать нестатический локальный Творца для создания актеров; сделать его статическим или верхнего уровня

поэтому я начинаю писать статический класс, который имеет параметры, которые необходимо передать.

static class LocalCreator implements Creator<Master>{
    public Master create(){
        return new Master(nrOfWorkers, nrOfMessages, nrOfElements, listener);
    }
}

Вопрос

Как передать параметры nrOfWorkers и т.д. в функцию create() элегантно?

4b9b3361

Ответ 1

Если вы читаете документы Akka (вкус Java), в нем перечислены два способа создания актера с параметрами конструктора. Первый так выглядит (используя ваши классы):

ActorSystem system = ActorSystem.create("PiSystem");
final ActorRef listener = system.actorOf(Props.create(Listener.class), "listener");
ActorRef master = system.actorOf(Props.create(Master.class, nrOfWorkers, nrOfMessages, nrOfElements, listener), "master");
master.tell(new Calculate(), ActorRef.noSender());

Или, если вы не хотите идти по этому маршруту, вы можете использовать Creator так:

public class MasterCreator implements Creator<Master>{
  private int nrOfWorkers, nrOfMessages, nrOfElements;
  private ActorRef listener;
  public MasterCreator(int nrOfWorkers, int nrOfMessages, int nrOfElements, ActorRef listener){
    this.listener = listener;
    this.nrOfElements = nrOfElements;
    this.nrOfMessages = nrOfMessages;
    this.nrOfWorkers = nrOfWorkers;
  }

  public Master create(){
    return new Master(nrOfWorkers, nrOfMessages, nrOfElements, listener);
  }
}

И затем используйте его следующим образом:

  ActorSystem system = ActorSystem.create("PiSystem");
  final ActorRef listener = system.actorOf(Props.create(Listener.class), "listener");
  ActorRef master = system.actorOf(Props.create(new MasterCreator(nrOfWorkers, nrOfMessages, nrOfElements, listener)), "master");
  master.tell(new Calculate(), ActorRef.noSender());