gpt4 book ai didi

scala - 与 pipeTo 等效的 Akka 类型是什么?

转载 作者:行者123 更新时间:2023-12-01 07:47:32 25 4
gpt4 key购买 nike

我目前正在尝试将现有的无类型转换重写为有类型的转换。由于参与者正在使用 ScalikeJDBC 与 MySQL 数据库进行对话,并且由于我希望异步完成,因此我正在处理来自单独(非参与者)存储库类的 Futures。

使用无类型 Akka,在 Actor 的接收方法中,我可以这样做:

import akka.pattern.pipe
val horseList : Future[Seq[Horse]] = horseRepository.listHorses(...)
horseList pipeTo sender()

发送者 actor 最终会收到一个马匹列表。我无法弄清楚如何在行为中执行此操作,例如:
val behaviour : Behavior[ListHorses] = Behaviors.receive { 
(ctx,msg) => msg match {
case ListHorses(replyTo) =>
val horseListF : Future[Seq[Horse]] = horseRepository.listHorses(...)
// -> how do I make horseListF's content end up at replyTo? <-
Behaviors.same
}
}

管道模式不起作用(因为它需要一个无类型的 ActorRef),到目前为止我还没有在 akka-actor-typed 中找到任何其他东西。 (2.5.12) 依赖我用来做这项工作。

我该怎么做呢?

最佳答案

在 Akka 2.5.22(可能更早)中有 context.pipeToSelf :

  def pipeToSelf[Value](future: Future[Value])(mapResult: Try[Value] => T): Unit

您仍然需要为 Success 提供模式匹配。和 Failure ,在我的代码中,我用这种糖减少了:
def mapPipe[A, T](success: A => T, failure: Throwable => T): Try[A] => T = {
case Success(value) => success(value)
case Failure(e) => failure(e)
}

导致这样的调用:
case class Horses(horses: Seq[Horse]) extends Command
case class HorseFailure(e: Throwable) extends Command

...

context.pipeToSelf(horseList) {
mapPipe(Horses,HorseFailure)
}

关于scala - 与 pipeTo 等效的 Akka 类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50161713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com