0

在这个例子中:

http://doc.akka.io/docs/akka/snapshot/java/testing.html

final Props props = Props.create(MyActor.class);
final TestActorRef<MyActor> ref = TestActorRef.create(system, props, "testB");
final Future<Object> future = akka.pattern.Patterns.ask(ref, "say42", 3000);
assertTrue(future.isCompleted());
assertEquals(42, Await.result(future, Duration.Zero()));

做什么:assertTrue(future.isCompleted());检查?让它返回的方法是什么false

编辑:

我找到了制作方法isCompleted() false。我false在演员课上的时候我没有什么可以返回/tell返回

(但对我来说似乎很奇怪。这似乎是一种验证.. 演员能够为特定类型的消息返回一些东西):

if( message instanceof PutConfigurationMessage) {

        PutConfigurationMessage putConfigurationMessage = (PutConfigurationMessage) message;

        initSomeConfigurations(putConfigurationMessage.getConfigurations());

        // here might be this line:  `getSender().tell(resultMessage, getSelf());`

}

现在的问题是:如果我不想返回/告诉任何东西,我应该怎么做?有点“好吧”。没有例外就没有问题?或者 ??

4

3 回答 3

1

起初,该代码在我看来是错误的。通常,未来是在另一个线程上计算的,并且是completed在另一个线程完成计算结果的时候。isCompleted因此,在 Future启动之后,不等待它完成 就断言 Future 看起来是非常错误的。

但是他们在您链接到的文档中解释的是,当使用 时TestActorRef,未来是在同一个线程上计算的。所以未来是在Pattern.ask()被调用时计算的,只有在计算的所有内容都运行之后,它才会转到下一行,assert(future.isCompleted). 使用时是这样TestActorRef,但在实际程序中则不然。

它们删除了用于测试的并发/多线程,因为由于其不确定性,几乎不可能测试多线程代码。

于 2013-05-17T20:31:46.437 回答
0

它断言 future.isComplete() 返回了“真”。如果返回“false”,则会失败。

于 2013-05-17T20:19:29.407 回答
0

使用 TestActorRef 测试 Akka-Actor 与使用 ActorRef 完全不同:

  • TestActorRef应该用于同步测试
  • ActorRef应该用于集成测试

当声明 TestActorRef 时,actor 的运行线程将是一个同步运行的线程,并在与您的测试/控制台运行相同的线程上同步处理整个 ActorSystem 。

引用您提到的文章中的两个重要段落:

发送给参与者的消息在当前线程上同步处理,并且可以照常发回答案。

...

TestActorRef 覆盖了两个字段:它将调度程序设置为 CallingThreadDispatcher.global 并将 receiveTimeout 设置为 None。

我为您的新问题找到了答案

在检查之前您应该等待一段时间future.isCompleted()
我的代码现在看起来像这样(注意第 4 行):

final Props props = Props.create(MyActor.class);
final TestActorRef<MyActor> ref = TestActorRef.create(system, props, "testB");
final Future<Object> future = akka.pattern.Patterns.ask(ref, "say42", 3000);
Await.ready(future, scala.concurrent.duration.Duration.Inf());
// Following assert should be true by now
assertTrue(future.isCompleted());
assertEquals(42, Await.result(future, Duration.Zero()));

可以不返回/告诉任何东西。ActorModel 建议您,如果演员工作中出现任何错误或问题,您应该使用“容错”将错误消息“告诉”主管演员如果您不返回/告诉任何内容,则无法使用 isCompleted of Future。考虑使用主管演员来处理演员的结果并测试他。

于 2015-07-01T08:32:58.403 回答