我有一个集成测试,它向远程 Akka (2.0.5) 参与者发送大量消息。每次测试运行后,远程参与者树都会重新启动。在 43 次成功的测试运行后,根据调试级别的日志消息,远程参与者开始向自己发送回复,这显然导致了测试失败。
为什么会发生这种情况?
我在代码库中只有一个地方发送这些类型的消息,它清楚地表明
sender ! generateTheMessage()
我有一个集成测试,它向远程 Akka (2.0.5) 参与者发送大量消息。每次测试运行后,远程参与者树都会重新启动。在 43 次成功的测试运行后,根据调试级别的日志消息,远程参与者开始向自己发送回复,这显然导致了测试失败。
为什么会发生这种情况?
我在代码库中只有一个地方发送这些类型的消息,它清楚地表明
sender ! generateTheMessage()
我弄清楚为什么在我的特殊情况下会发生这种情况。这里实际上涉及两个演员:
A -> B
A 最初将消息排队,直到系统初始化。然后它将排队的消息发送到 B,并在所有进一步的消息到达后立即将它们转发给 B。
问题是当它转发排队的消息时,原来的发送者信息已经丢失,所以A成为发送者。所以来自 B 的回复会返回给 A 并再次转发回 B。我最初并没有意识到后一种转发正在发生,因为我没有为转发启用日志记录。
所以这是一个竞争条件。如果系统启动得足够快,一切正常,但如果不是,一些初始回复将被误导。
我解决这个问题的方法是将发送者与每条排队的消息配对,并使用 Java API 重新发送每条排队的消息,它允许明确指定发送者。