Scala Akka Actor - 获取 Actor 的状态

标签 scala akka actor

receive方法在 Akka Actor 中定义 Actor 的行为。我正在寻找一种方法,它可以为我提供 Actor 可以在 Scala 中最好在运行时处理的所有不同消息(及其类型)。

最佳答案

直接答复

不幸的是,您要求的功能在 akka 中不可用。 . receive方法 is defined as :

type Receive = PartialFunction[Any, Unit]

abstract def receive : Actor.Receive
PartialFunction没有办法枚举它可以处理的所有类型。此外,一旦 Actor已实例化为 ActorRef您无权访问底层 receive方法。

一种替代方法是在 Actor 之外定义您的接收。实现然后使用 isDefinedAt method of PartialFunction 测试特定值:
object MyActor {
  val myPartial : Receive = {
    //receive functionality
  }
}

class MyActor extends Actor {
  override def receive : Receive = MyActor.myPartial
}

//test if a value can be processed by MyActor

val testValue = 42

val testValueIsDefined = MyActor.myPartial.isDefinedAt(testValue)

间接回答

如果您正确组织代码,那么问题的基础就变得不必要了。

我发现一个好的做法是严格声明 Actor 可以接收哪些类型的输入:
sealed trait MyActorInputs

case class Foo(value : Int) extends MyActorInputs
case class Bar(value : String) extends MyActorInputs

object MyActor {
  val processInput : MyActorInput => Unit = ???
}

class MyActor extends Actor {
  override def receive : Receive = {
    case input : MyActorInput => 
      MyActor.processInput(input)
    case unknown => 
      System.error.println(s"MyActor received unknown input: $unknown")
  }
}

此技术不提供编译器时间检查或严格保证,但如果您在所有 Actor 中采用它,那么它往往会使大型项目的工作变得更轻松。它还可以让您use reflection to dynamically get a list of available input types .

关于Scala Akka Actor - 获取 Actor 的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53401081/

相关文章:

scala - 在 Akka 消息中发送 future 可以吗?

multithreading - Play Framework : thread-pool-executor vs fork-join-executor

列出与其类型匹配的元素

scala - 将 BigDecimal 与整数相乘

scala - 什么时候使用 TrieMap 合适?

scala - 为什么 Source.tick 在 100 个 Http 请求后停止?

java - 自定义 Actor 的 Libgdx scene2d.ui InputListener 不起作用

postgresql - 批量插入时 Slick 3.0 中的数据库异常

stream - akka 流 ActorSubscriber 不适用于远程 Actor

eclipse - Akka Actors 库是否与 Scala 2.10 的 Scala IDE 一起安装?