java - Junit 测试 Akka 单例 Actor : preStart() hook not called

标签 java eclipse junit akka

我想在 Eclipse SDK 的 Scala IDE 构建中使用 java 测试单例 Actor(构建 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什么也没做,打印输出是: 仅限 Actor[akka://ClusterSystem/user/proxy#-893814405],它是从 ClusterSingletonProxy 打印的。也不异常(exception),Junit 已完成,绿旗。在调试时不会调用ClassSingleton(包括构造函数和preStart())。确实是我,但是有什么错吗?更令人困惑的是,相同的 ClassSingleton ClusterSingletonManager 代码在 javatestkit 和 junit 之外运行良好。

我怀疑集群设置可能是负责任的,因此我尝试包含和排除以下代码(没有效果)。但是我想了解为什么我们需要它,如果我们需要它(它来自示例代码)。 非常感谢您的帮助。

Address clusterAddress = Cluster.get(system).selfAddress();
Cluster.get(system).join(clusterAddress);

最佳答案

代理模式标准行为是找到最旧的节点并在那里部署“真实”参与者,并且代理参与者在所有节点上启动。我怀疑集群配置未完成,因此您的参与者从未启动。

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

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

关于java - Junit 测试 Akka 单例 Actor : preStart() hook not called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22782671/

相关文章:

Eclipse 工作区备份

java - 单元测试旨在检查特定故障,但即使抛出了预期的异常,它仍然失败?

java - 如何使用 Mockito 和 JUnit 定义通过链依赖调用的方法的行为?

java - 我可以定义 Eclipse 清理规则的异常(exception)吗?

java - 在 Jenkins 中使用 Maven 解析 POM 文件时出错

java - 测试没有运行

java - spring 和 junit bean 注入(inject)和实例化

java - 在java中使用Arrays.fill方法分配默认值时出现ArrayStoreException

java - 将 Axis 1.4 stub 项目移动到基于 Maven 的项目(类型访问限制)

java - Java 最多只拆分 5 个逗号