关于scala:在akka中处理多条消息

Handling multiple messages in akka

在一个actor模型中处理多条消息的最佳方法是什么?

例如,如果您需要从一个参与者返回 2 条不同的消息,那么如何访问和检索来自另一个参与者的两条消息?


这是一个示例,展示了如何处理来自演员的不同结果。

给定以下演员:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
case object GiveMeAFruit

trait Fruit

case class Apple(size: Int) extends Fruit

case class Pear(color: String) extends Fruit

class FruitNinja extends Actor {
  def receive = {
    case GiveMeAFruit =>
      if (math.random > 0.5)
        sender ! Apple(42)
      else
        sender ! Pear("yellow")
  }
}

与其他演员交流

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class HungryActor extends Actor {
  val fruitNinja = context.actorOf(Props[FruitNinja])

  override def preStart = {
    context.system.scheduler.schedule(5 seconds, 5 seconds, fruitNinja, GiveMeAFruit)
  }

  def receive = {
    // handle different returns from FruitNinja
    case Apple(size) =>
      println(s"Got an apple sized $size.")
    case Pear(color) =>
      println(s"Got a $color pear")
  }
}

通过"正常"代码与演员通信

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import akka.pattern.ask

def eatSomething = {
  // create an instance of the actor using an actorsystem in scope
  val fruitNinja = Akka.system.actorOf(Props[FruitNinja])

  (fruitNinja ? GiveMeAFruit).mapTo[Fruit].map{
    // handle different returns from FruitNinja
    case Apple(size) =>
      println(s"Got an apple sized $size.")
    case Pear(color) =>
      println(s"Got a $color pear")
  }
}

Akka 中的 Actor 可以响应多种不同类型的消息,也可以发送任何消息...

1
2
3
4
5
6
7
8
9
10
11
12
case class Message1(id: Long)
case class Message2(thing: String)
case class Response1(x: Int)
case class Response2(y: Int)

class MyActor extends Actor with ActorLogging {

    def receive = {
         case Message1(id) => sender ! Response1(id)
         case Message2(t)  => sender ! Response2(1)
    }
}

您所要做的就是在 receive 方法中使用 case 语句查找它们。