【发布时间】:2021-03-28 03:54:06
【问题描述】:
我有一个场景需要提供特定类型的行为。此 Behavior 还需要处理在 Event Stream 上发布的事件。所以说具体的类型是:
case class DoSomething(i: Int)
然后我需要实现一个函数来返回一个行为来处理这种类型的消息:
def foo(): Behavior[DoSomething]
然后我还需要在事件流上处理以下消息:
case class PublishedEvent(str: String)
我想出的唯一解决方案是从我的 DoSomething 行为中生成另一个演员,然后将消息转发给它:
sealed trait Command
case class Command1(str: String) extends Command
case class Command2(str: String) extends Command
def foo(): Behavior[DoSomething] = Behaviors.setup { context =>
val actor = context.spawnAnonymous[Command](Behaviors.setup { context =>
context.system.eventStream ! EventStream.Subscribe(context.messageAdapter {
case PublishedEvent(str) => Command2(str)
})
Behaviors.receiveMessage {
case Command1(str) =>
println("Received Command1: " + str)
Behaviors.same
case Command2(str) =>
println("Received Command1: " + str)
Behaviors.same
}
})
Behaviors.receiveMessage {
case DoSomething(i) =>
actor ! Command1(i.toString)
Behaviors.same
}
}
我的问题是有什么方法可以避免产生一个新的演员并在同一个演员内完成这一切?即有没有办法可以将Behavior[Command] 映射到Behavior[DoSomething]?
【问题讨论】:
-
我不太清楚你的意思,你为什么不直接创建一个actor并将命令作为消息传递给它?
-
我可能应该指定这是针对 Akka 2.6.x 的,它应该是完全类型安全的
标签: scala akka akka-typed