我想在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);
答案 0 :(得分:2)
代理模式标准行为是找到最旧的节点并在那里部署“真实”角色,并在所有节点上启动代理角色。我怀疑群集配置没有完成,因此你的演员从未开始。
join
方法使节点成为群集的成员。因此,如果没有人加入群集,则无法创建具有代理的actor。
问题是你在junit test期间读取的配置文件是否有创建集群的所有信息?种子节点?端口是否设置为与种子节点相同?