【问题标题】:Get target/recipient of Akka ask获取 Akka ask 的目标/收件人
【发布时间】:2021-12-05 16:28:36
【问题描述】:

我在我的 Akka 经典项目中使用以下 sn-p 代码。

(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

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    答案就在您的问题中。 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)
    

    发送的消息将是 ActorRefPersistedFailure 的元组,因此您可以在接收中将它们与类似的内容匹配

    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 是一个本地(且不可变)值,所以关闭它是安全的。

    【讨论】:

    • 谢谢!你说得很有道理。我真的很想在pipeTo 中返回persistence 地址。因为假设有一个persistence 列表,然后我不知道哪个Persist 消息是由哪个persistence 发送的。
    • 知道了!我想我将围绕包含地址和管道的响应创建一个包装器。感谢您的提示!
    • 是的,您可以将其添加到请求未来的 map 中(尽管如果 persistence 是某个演员级别的状态,而不是您进入的状态,您需要小心处理该特定消息的过程:在前一种情况下,我建议先将其保存到局部变量中,否则您可能会从下面拉出众所周知的地毯)
    • 我会编辑答案...
    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 2017-03-20
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多