我有一个叫Validator
的演员。 actor的目的是验证消息。每条消息都有自己的UUID,每条消息都通过设置唯一名称来创建自己的Validator实例。标识为17285ed2-ffdb-11e4-a322-1697f925ec7b
的邮件的Actor路径如下所示:/user/protocols/17285ed2-ffdb-11e4-a322-1697f925ec7b
。显然,一旦验证了消息,演员就会被停止。
Validator在其层次结构中有两个actor。他们都负责消息的不同部分和独立。以下是它们的创建方式:
override def preStart() {
actorOf(Props[IdValidator], "schema-validator") ! schema
actorOf(Props[PayloadValidator], "info-validator") ! info
}
如果我有异常,则根据默认监督策略重新启动Validator,并且因为在actor类的每个新实例上调用preStart
,它会尝试重新创建层次结构。当它试图这样做时,actorOf
抛出一个异常,说演员名称不是唯一的(即
/用户/协议/ 17285ed2-ffdb-11e4-a322-1697f925ec7b /模式验证器)
根据文档,停止儿童的过程是重启过程的一部分。更重要的是,它是同步完成的 - 运行时将确保每个孩子通过向他们的DeathWatch发送Terminated消息来报告其停止。
显然,我可以通过删除儿童的明确名称来解决这个问题,但我的问题是 - 这是一种预期的行为,保证儿童演员不会真正删除他们(他们似乎仍然作为旧的一部分存在层次)