akka 给定一个行为的示例,我是否可以将消息应用于该示例以创建新行为

w8f9ii69  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(154)

我有这样一个场景:在接收消息时,我正在处理需要一些额外信息的通用行为:

case class A(count: Int)

type MyBehavior[T] = Behavior[(A, T)]

处理此额外信息的代码可能如下所示:

case class B(str: String)

def active(b: B): MyBehavior[B] = Behaviors.receiveMessage {
  case (a, b) =>
    active(b.copy(str = a.count.toString)
}

然后,我有一个函数来处理这个行为,但是给定一个行为的引用,我不知道如何应用一个消息来创建一个新的行为:

def f[T](a: A, behavior: MyBehavior[T])(implicit ct: ClassTag[T]): Behavior[T] =
    Behaviors.receiveMessage {
        case t: T =>
            val newBehavior: MyBehavior[T] = ???   // Can I pass a and t?
            f(a.copy(count = a.count + 1), newBehavior)
}

是否有方法将消息应用于行为以创建新行为?

bz4sfanl

bz4sfanl1#

您可以使用context生成一个新的参与者,并从当前参与者向if发送一条消息。这样,您就可以在该参与者执行操作之前“预置”一些逻辑。

Behaviors.setup { context =>

  def f[T](implicit ct: ClassTag[T]): Behavior[(A, T)] =
    Behaviors.receiveMessage {
      case (a: A, t: T) =>
        val newA = a.copy(count = a.count + 1)
        val newActor = context.spawn(f[T])
        newActor ! (newA, t)
    }
}

你的代码中缺少了一个重要的东西--行为是一个参与者的 * 配方 *,但它 * 本身不是一个参与者 *。你必须使用ActorSystem(behavior, actorSystemName)(整个系统的入口)或通过context.spawn(behavior)来示例化它。如果没有这个,你的递归调用将只是递归调用,而不是从参与者向新产生的参与者发送消息。

相关问题