如何将经典的 ActorContext 转换为类型化的
How do I convert a classic ActorContext to a typed one
假设我定义了一些消息:
sealed trait Command
case class A(i: Int) extends Command
case class B(str: String) extends Command
然后像下面这样的经典演员来处理这些消息。创建时我需要访问 ActorContext 但作为类型化上下文不是经典
class MyActor extends Actor {
val typedContext: ActorContext[Command] = ???
def receive = {
case A(i) =>
// Do something with i
case B(str)
// Do something with str
}
}
我知道我可以执行 self.toTyped[Command] 来获取键入的自我引用。但是我找不到与 ActorContext 类似的东西。我将如何进行转换?
没有从经典 ActorContext
到类型化 ActorContext
的转换。关于类型 ActorContext
可以做而经典 ActorContext
不能做的唯一事情是:
- 询问另一个演员并调整结果(要在经典中做到这一点,您可以使用经典的询问模式:
import akka.pattern.ask
)
- 将未来传递给演员(为此
import akka.pattern.pipe
)
- 利用类型化 actor 的生命周期(生成、监视、取消监视、停止)
对于最后一个,你可以
import akka.actor.typed.scaladsl.adapter.ClassicActorContextOps
这将添加
spawn
/spawnAnonymous
watch
unwatch
stop
处理类型化的方法。
假设我定义了一些消息:
sealed trait Command
case class A(i: Int) extends Command
case class B(str: String) extends Command
然后像下面这样的经典演员来处理这些消息。创建时我需要访问 ActorContext 但作为类型化上下文不是经典
class MyActor extends Actor {
val typedContext: ActorContext[Command] = ???
def receive = {
case A(i) =>
// Do something with i
case B(str)
// Do something with str
}
}
我知道我可以执行 self.toTyped[Command] 来获取键入的自我引用。但是我找不到与 ActorContext 类似的东西。我将如何进行转换?
没有从经典 ActorContext
到类型化 ActorContext
的转换。关于类型 ActorContext
可以做而经典 ActorContext
不能做的唯一事情是:
- 询问另一个演员并调整结果(要在经典中做到这一点,您可以使用经典的询问模式:
import akka.pattern.ask
) - 将未来传递给演员(为此
import akka.pattern.pipe
) - 利用类型化 actor 的生命周期(生成、监视、取消监视、停止)
对于最后一个,你可以
import akka.actor.typed.scaladsl.adapter.ClassicActorContextOps
这将添加
spawn
/spawnAnonymous
watch
unwatch
stop
处理类型化的方法。