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