代码之家  ›  专栏  ›  技术社区  ›  riccardo.cardin

Akka Ask模式有多种类型的回答

  •  0
  • riccardo.cardin  · 技术社区  · 7 年前

    Applied Akka Pattern Ask Pattern .

    Main 接受一个 Create CreateAck CreateNack(error) .

    我使用的代码大致如下。

    implicit val timeout = Timeout(5 seconds)
    def create() = (mainActor ? Create).mapTo[???]
    

    问题很明显,我不知道该用哪种类型 mapTo 函数,而不是 ??? .

    我是否使用了正确的方法?有没有其他有用的模式可以从不使用Actors的外部程序访问Actor系统?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Konrad 'ktoso' Malawski    7 年前

    如果你确实需要将它们与“外部”整合,那么ask模式确实很好。但请注意,如果你是在一个演员身上做这件事,这可能不是最好的方式。

    如果有许多不相关的反应类型,我建议:

    (1) 制作这样的普通类型;这可以简单到:

    sealed trait CreationResponse
    final case object CreatedThing extends CreationResponse
    final case class FailedCreationOfThing(t: Throwable) extends CreationResponse
    final case class SomethingElse...(...) extends CreationResponse
    

    (2) 对于完全不相关的类型,顺便说一句,只需在未来收集即可,而无需执行 mapTo :

    val res: Future[...] = (bob ? CreateThing) collect { 
      case t: ThatWorked => t // or transform it
      case nope: Nope    => nope // or transform it to a different value
    }
    

    t nope 如果有一个通用的超类型,那么该类型将是 ... 在结果中 Future case _ => whatever 例如,它会指向编程错误。

        2
  •  0
  •   Rjk    7 年前

    CreateAck CreateNack(error) 从任何类型的类或对象继承。如果是这种情况,您可以在 .mapTo[CreateResultType] .

    .mapTo[Any] 并使用 match case 查找结果类型。