在 Akka Actors 中编写多个接收函数
Compose more than one receive function in Akka Actors
我有一个 Akka Actor 可以管理一些消息,例如 Find
、Query
,它们可以将新消息转发给其他类型的 actor。这些参与者将使用新类型的消息进行响应。
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... */
}
}
在上面的例子中,QueryAck
是Find
类型消息转发的响应消息。 UpsertNAck
和 UpsertAck
是对 Upsert
消息的可能响应。
为了使代码更具可读性和可维护性,我希望将两组 case
分组到两个专用方法中,即 manageQueries
和 manageUpserts
,获得类似于以下代码。
class Actorbase extends Actor {
override def receive = {
manageQueries.andThen(manageUpserts)
}
}
有可能吗?我是否需要声明多个返回 Receive
对象的方法,然后以某种方式组合它们?
非常感谢。
Receive
只是 PartialFunction[Any, Unit]
的类型别名,所以你可以在任何地方定义这样的别名,然后使用 f1 orElse f2
:
组合它们
val manageQueries: Receive = { case ... }
val manageUpserts: Receive = { case ... }
def receive = manageQueries.orElse(manageUpserts)
希望对您有所帮助
我有一个 Akka Actor 可以管理一些消息,例如 Find
、Query
,它们可以将新消息转发给其他类型的 actor。这些参与者将使用新类型的消息进行响应。
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... */
}
}
在上面的例子中,QueryAck
是Find
类型消息转发的响应消息。 UpsertNAck
和 UpsertAck
是对 Upsert
消息的可能响应。
为了使代码更具可读性和可维护性,我希望将两组 case
分组到两个专用方法中,即 manageQueries
和 manageUpserts
,获得类似于以下代码。
class Actorbase extends Actor {
override def receive = {
manageQueries.andThen(manageUpserts)
}
}
有可能吗?我是否需要声明多个返回 Receive
对象的方法,然后以某种方式组合它们?
非常感谢。
Receive
只是 PartialFunction[Any, Unit]
的类型别名,所以你可以在任何地方定义这样的别名,然后使用 f1 orElse f2
:
val manageQueries: Receive = { case ... }
val manageUpserts: Receive = { case ... }
def receive = manageQueries.orElse(manageUpserts)
希望对您有所帮助