答案就在您的问题中。 persistence 是询问的目标。
persistence 有可能将工作委派给另一个参与者(例如,池中的工作人员),但这会揭示实现细节,并且 tbh 可能不会那么有用(这就是为什么 ask 模式不'不传播发件人)。
如果它是您控制的协议,则可以保证在响应中显式添加ActorRef。
您可以推出自己的请求模式版本来传播发送者,尽管如上所述,它可能不会那么有用。
编辑:将persistence 传播到转发的回复中,最简单的方法是将map 询问的Future 结果放入将persistence 与结果捆绑在一起的东西(作为一种相关ID),例如:
(persistence ? Persist("a", Some(100), 123)) (100.milliseconds)
.mapTo[Persisted]
.map { response => persistence -> response }
.recoverWith { ex => persistence -> Failure(ex.getMessage) }
.pipeTo(self)
发送的消息将是 ActorRef 和 Persisted 或 Failure 的元组,因此您可以在接收中将它们与类似的内容匹配
case (persistenceTarget, Persisted(...)) => ???
case (persistenceTarget, Failure(msg)) => ???
(您也可以将协议显式更改为包含ActorRef 的内容:元组可能有点过于原始,但在不了解协议的更多细节的情况下可以方便地回答这个问题)
请注意,如果persistence 是您的Actor 中的一个字段,它可能会在您发送询问和执行map/recoverWith 之间发生变化:map/recoverWith 将结束拾取改变的值。这种无意的“关闭”actor 状态是 Akka 中令人讨厌的错误的长期来源,因此可能值得拥有一个
val persistenceTarget = persistence
并将 ask/map/recoverWith 中提到的 persistence 替换为 persistenceTarget:因为 persistenceTarget 是一个本地(且不可变)值,所以关闭它是安全的。