获取阿卡询问的目标/收件人



我在我的 Akka 经典项目中使用以下代码片段。

(persistence ? Persist("a", Some(100), 123)) (100.milliseconds)
.mapTo[Persisted]
.recover(ex => Failure(ex.getMessage()))
.pipeTo(self)

当我处理此ask的成功响应时,发件人self。如何获取此ask响应的发送者?换句话说,如何在此处获取目标/接收者参与者的地址?

编辑:

很明显,persistence是询问的目标。但我真正想知道的是,是否有办法通过pipeTo提供persistence地址。假设有一系列persistence,我不知道哪个Persist消息来自哪个persistence

答案在你的问题中。persistence是询问的目标。

persistence可能会将工作委托给另一个参与者(例如池中的工作线程),但这会显示实现细节,并且 tbh 可能不会那么有用(这是 ask 模式不传播发送者的部分原因)。

如果它是你控制的协议,则向响应显式添加ActorRef可以保证正常工作。

您可以滚动自己的 ask 模式版本来传播发送者,尽管如上所述,它可能不会那么有用。

编辑:要将persistence传播到转发的回复中,最简单的方法是将询问的Future结果map为将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的东西:元组可能有点太原始了,但对于这个答案很方便,而无需了解有关协议的更多详细信息)

请注意,如果persistenceActor中的一个字段,则在发送询问和执行map/recoverWith时之间可能会发生变化:map/recoverWith最终将拾取更改的值。 这种无意中"关闭"的演员状态是 Akka 中令人讨厌的错误的长期来源,因此可能值得拥有一个

val persistenceTarget = persistence

并将 ask/map/recoverWith中提及的persistence替换为persistenceTarget:由于persistenceTarget是一个本地(且不可变)的值,因此关闭是安全的。

相关内容

  • 没有找到相关文章