我在我的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
。
1条答案
按热度按时间0s7z1bwu1#
答案就在你的问题中。
persistence
是提问的目标。有可能
persistence
正在将工作委托给另一个参与者(例如,池中的工作者),但这将揭示实现细节,并且tbh可能不会那么有用(这是为什么ask模式不传播sender的一部分)。如果它是一个由您控制的协议,那么显式地向响应添加一个
ActorRef
就可以保证工作。您可以使用自己的ask模式版本来传播发送者,尽管如上所述,它可能不会那么有用。
EDIT:要将
persistence
传播到转发的回复中,最简单的方法是将ask的Future
结果map
绑定到将persistence
与结果捆绑在一起的内容中(作为一种相关ID),如下所示:发送的消息将是
ActorRef
和Persisted
或Failure
的元组,因此您可以在receive中将它们与以下内容匹配(You还可以显式地将协议更改为包含
ActorRef
:元组可能有点太原始了,但是在不知道关于协议的更多细节的情况下,对于这个答案是方便的)请注意,如果
persistence
是Actor
中的一个字段,那么在您发送请求和执行map
/recoverWith
之间,它可能会发生变化:map
/recoverWith
将最终获得更改后的值。这种无意中的“关闭”参与者状态是Akka中长期存在的严重错误的根源,因此可能值得使用以及用
persistenceTarget
替换在ask/map
/recoverWith
中对persistence
的提及:由于persistenceTarget
是一个本地(且不可变)值,因此关闭它是安全的。