Я хотел бы протестировать синглтон-актера, используя java в Scala IDE-сборке Eclipse SDK (Build id: 3.0.2-vfinal-20131028-1923-Typesafe), а Akka - 2.3.1.
public class WorkerTest {
static ActorSystem system;
@BeforeClass
public static void setup() {
system = ActorSystem.create("ClusterSystem");
}
@AfterClass
public static void teardown() {
JavaTestKit.shutdownActorSystem(system);
system = null;
}
@Test
public void testWorkers() throws Exception {
new JavaTestKit(system) {{
system.actorOf(ClusterSingletonManager.defaultProps(
Props.create(ClassSingleton.class), "class",
PoisonPill.getInstance(),"backend"), "classsingleton");
ActorRef selection = system.actorOf(ClusterSingletonProxy.defaultProps("user/classsingleton/class", "backend"), "proxy");
System.out.println(selection);
}};
}
}
classSingleton.java:
public class ClassSingleton extends UntypedActor {
LoggingAdapter log = Logging.getLogger(getContext().system(), this);
public ClassSingleton() {
System.out.println("Constructor is done");
}
public static Props props() {
return Props.create(ClassOperator.class);
}
@Override
public void preStart() throws Exception {
ActorRef selection = getSelf();
System.out.println("ClassSingleton ActorRef... " + selection);
}
@Override
public void onReceive(Object message) {
}
@Override
public void postStop() throws Exception {
System.out.println("postStop ... ");
}
}
Актер ClassSingleton ничего не делает, распечатка: только Actor [akka://ClusterSystem/user/proxy # -893814405], который печатается из ClusterSingletonProxy. Никаких исключений и Junit не сделано, зеленый флаг. При отладке ClassSingleton не вызывается (включая contructor и preStart()). Конечно, это я, но в чем ошибка? Еще более запутанно, что тот же класс ClassSingleton ClusterSingletonManager работает отлично за пределами javatestkit и junit.
Я подозреваю, что настройка кластера может быть отчитана, поэтому я попытался включить и исключить следующий код (без эффекта). Однако я хотел бы понять, зачем нам это нужно, если нам это нужно (это из примера кода). Большое спасибо за вашу помощь.
Address clusterAddress = Cluster.get(system).selfAddress();
Cluster.get(system).join(clusterAddress);
Стандартное поведение шаблона прокси-сервера заключается в том, чтобы найти самый старый узел и развернуть "настоящего" актера, а актеры-посредники запускаются на всех узлах. Я подозреваю, что конфигурация кластера не была завершена, и поэтому ваш актер никогда не начинал.
Метод join
делает узел членом кластера. Поэтому, если никто не присоединяется к кластеру, актер с прокси не может быть создан.
Вопрос в том, что ваши файлы конфигурации, которые читаются во время теста junit, имеют всю информацию для создания кластера? Семенной-узлы? Установлен ли порт таким же, как у семенного узла?