0

我有一个集成测试,它向远程 Akka (2.0.5) 参与者发送大量消息。每次测试运行后,远程参与者树都会重新启动。在 43 次成功的测试运行后,根据调试级别的日志消息,远程参与者开始向自己发送回复,这显然导致了测试失败。

为什么会发生这种情况?

我在代码库中只有一个地方发送这些类型的消息,它清楚地表明

sender ! generateTheMessage()
4

1 回答 1

1

我弄清楚为什么在我的特殊情况下会发生这种情况。这里实际上涉及两个演员:

A -> B

A 最初将消息排队,直到系统初始化。然后它将排队的消息发送到 B,并在所有进一步的消息到达后立即将它们转发给 B。

问题是当它转发排队的消息时,原来的发送者信息已经丢失,所以A成为发送者。所以来自 B 的回复会返回给 A 并再次转发回 B。我最初并没有意识到后一种转发正在发生,因为我没有为转发启用日志记录。

所以这是一个竞争条件。如果系统启动得足够快,一切正常,但如果不是,一些初始回复将被误导。

我解决这个问题的方法是将发送者与每条排队的消息配对,并使用 Java API 重新发送每条排队的消息,它允许明确指定发送者。

于 2013-01-22T09:36:31.513 回答