Scala 奇怪/随机行为混合了参与者和守护进程参与者

Scala 奇怪/随机行为混合了参与者和守护进程参与者,scala,actor,Scala,Actor,这可能与以前的某个事件有关,但我不太确定 我有一个基于Scala/Actor的子系统,它使用3个合作的Actor来完成一些工作。每个参与者实际上都是一个守护者。外部消息被发送到主参与者,偶尔也会从辅助参与者向主参与者发送消息,要求其处理从外部消息收集的数据 我编写了一个测试驱动程序Scala程序来启动所讨论的子系统,并使用DaemonActor向子系统(即主参与者)发送消息 事实证明,发送到主参与者的消息是由主参与者处理的,但是从辅助子系统参与者发送到主参与者的消息没有被处理 我发现,如果我让测

这可能与以前的某个事件有关,但我不太确定

我有一个基于Scala/Actor的子系统,它使用3个合作的Actor来完成一些工作。每个参与者实际上都是一个守护者。外部消息被发送到主参与者,偶尔也会从辅助参与者向主参与者发送消息,要求其处理从外部消息收集的数据

我编写了一个测试驱动程序Scala程序来启动所讨论的子系统,并使用DaemonActor向子系统(即主参与者)发送消息

事实证明,发送到主参与者的消息是由主参与者处理的,但是从辅助子系统参与者发送到主参与者的消息没有被处理

我发现,如果我让测试驱动程序中的参与者成为非执事参与者,而不是守护星参与者,那么一切都会按预期进行。这是100%确定的,因为当外部测试驱动程序使用Actor时,子系统总是表现良好。当外部测试驱动程序使用DAEMonator时,子系统总是表现错误。在actor和DaemonActors之间切换时,没有对代码进行其他更改

更奇怪的是,当我制作了一个扩展的测试驱动程序,它使用两个参与者向子系统发送两种不同类型的消息时,我必须使测试驱动程序的一个参与者成为DAEMonator,或者使接收消息的子系统行为不正确

看起来很随意:-)

需要注意的一点是:测试驱动程序参与者实际上调用子系统类上的方法,该子系统类将方法调用“转换”为发送给主要子系统参与者的消息。这是为了与Java代码兼容

我尝试了许多不同的方法来判断消息是否在哪里被处理。然而,当程序运行时,我需要从程序中获得一些信息,然后我就开始打印出来了。因此,我引用了有关打印和刷新缓冲区的问题线程。唯一影响行为的似乎是演员对守护星

我可以发送代码,但会有很多


如有任何见解,将不胜感激

一个可能的问题是您尚未启动参与者?

DAEMonator的工作流程到底是什么,您使用的是Scala 2.7还是2.8?如果您将代码发布在gist或pastebin类型的系统上,我相信我们中的许多人都会很乐意查看它。:)


在2.8中,常规参与者防止运行时在其活动时终止;DaemonActors,顾名思义,不是。如果您只是向DaeMonator发送一条或多条消息,然后程序结束,它甚至可能永远不会向其他参与者发送消息。

谢谢,但我认为这不是问题所在。我在中断代码和工作代码之间所做的唯一更改是将我的测试程序Actors的父类从“DaemonActor”更改为“Actor”。实际上,我只是删除了6个“Daemon”字符。并重新编译/运行。如果我没有开始演员,那么我会认为我与任何一个家长阶级的问题。Wajiii,谢谢你的回答!在几周的疏忽之后,我回到我的程序中,发现了问题的根源,尽管这不是行为如此“随机”的原因。我从系统中的其他地方提取了一段代码,从未怀疑它会执行线程。sleep(somemilis)。