Junit测试一个Akka单例actor:没有调用preStart()钩子

时间:2014-04-01 10:06:48

标签: java eclipse junit akka

我想在Eclipse SDK的Scala IDE版本(Build id:3.0.2-vfinal-20131028-1923-Typesafe)中使用java测试单例actor,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);

1 个答案:

答案 0 :(得分:2)

代理模式标准行为是找到最旧的节点并在那里部署“真实”角色,并在所有节点上启动代理角色。我怀疑群集配置没有完成,因此你的演员从未开始。

join方法使节点成为群集的成员。因此,如果没有人加入群集,则无法创建具有代理的actor。

问题是你在junit test期间读取的配置文件是否有创建集群的所有信息?种子节点?端口是否设置为与种子节点相同?