在Akka Actors中编写多个接收功能

ric*_*din 2 scala composition reactive-programming akka

我有一个管理的一些消息,像阿卡演员FindQuery中,提出了新的消息,其他类型的演员。这些参与者将以新型消息进行响应。

class Actorbase extends Actor {
  override def receive = {
     /* The two message below are related to each other */
     case Find(coll, id) => // Do something
     case QueryAck(key, value, u) => // Do something
     /* The three message below are related to each other */
     case Upsert(collection, id, value) => // Do something
     case Response.UpsertNAck(key, msg, u) => // Do something
     case Response.UpsertAck(key, u) => // Do something
     /* And so on... */
  }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,QueryAck是类型为的消息的转发响应消息FindUpsertNAck并且UpsertAck可能是对Upsert消息的回应。

为了使代码更具可读性和可维护性,我希望通过case两种专用方法(即manageQueries和)将两组s 分组manageUpserts,以获取类似于以下代码的内容。

class Actorbase extends Actor {
  override def receive = {
     manageQueries.andThen(manageUpserts)
  }
}
Run Code Online (Sandbox Code Playgroud)

有可能吗?我是否需要声明一个以上的方法来返回一个Receive对象,然后以某种方式组合它们?

非常感谢。

Kon*_*ski 5

Receive仅仅是一个类型别名PartialFunction[Any, Unit],所以你可以定义这样的任何地方,使用组合它们f1 orElse f2

val manageQueries: Receive = { case ... }
val manageUpserts: Receive = { case ... }

def receive = manageQueries.orElse(manageUpserts) 
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 这比我认为的另一个更好(作为项目的维护者) (2认同)