我一直在努力学习 akka 演员和我真的需要你的帮助家伙!
所以我的目标基本上是写一个简单的拍卖代理。AKKA实际上有一个例子来说明如何做https://doc.akka.io/docs/akka/current/typed/replicated-eventsourcing-auction.html!问题是,我不知道如何运行它。现在我花了大约3天的时间来尝试让它工作,然后才寻求你的帮助,但我完全失去了它..:/
因此,我开始学习类型化的actor以及它们是如何工作的。我已经成功地在屏幕上打印了一些东西,方法是创建一个简单的actor系统,就像我在互联网上找到的这样,我有一个简单的order actor(类型化的),在它的apply方法上我可以打印传入的order:
//Entry point inside main(args <...>)
val orderProcessor: ActorSystem[OrderProcessor.Order] = ActorSystem(OrderProcessor(), "main")
//create a new order
orderProcessor ! Order(0, "Bananas")
//<..printing something inside the actor when receiving this message>
现在,拍卖示例使用了EventSourcedBehavior,因此我得出结论,下一步是学习Akka中的事件外包(希望目前为止没有混淆,或者希望我的方法是正确的)。因此,我查看了Akka的事件外包官方文档https://doc.akka.io/docs/akka/current/typed/persistence.html#module-info,并以他们的示例为例:
object MyPersistentBehavior {
sealed trait Command
final case class Add(data: String) extends Command
case object Clear extends Command
sealed trait Event
final case class Added(data: String) extends Event
case object Cleared extends Event
final case class State(history: List[String] = Nil)
val eventHandler: (State, Event) => State = { (state, event) =>
event match {
case Added(data) => state.copy((data :: state.history).take(5))
case Cleared => State(Nil)
}
}
val commandHandler: (State, Command) => Effect[Event, State] = { (state, command) =>
command match {
case Add(data) => Effect.persist(Added(data))
case Clear => Effect.persist(Cleared)
}
}
def apply(id: String): Behavior[Command] =
EventSourcedBehavior[Command, Event, State](
persistenceId = PersistenceId.ofUniqueId(id),
emptyState = State(Nil),
commandHandler = commandHandler,
eventHandler = eventHandler)
}
太棒了!非常简单简洁。
问题是,我不知道入口点在哪里?就像orderProcessor(我展示的第一个例子)很明显,它只是创建一个新的ActorSystem,仅此而已,但是我找不到关于这个例子的任何信息。我试过github的很多不同的项目,没有一个简单到我能理解。公平地说,大多数项目都有测试,但这些测试对我没什么帮助。
请,任何帮助,任何提示将非常感谢,我真的很挣扎的家伙!
我爱你们!〈3
2条答案
按热度按时间eufgjt7s1#
您必须获得
ActorRef[MessangeType]
,才能将MessageType
发送给它。现有参与者具有
context
(作为具有Behavior
定义的参数传递),您可以在其中创建如下所示的子项:但是您也可以从
ActorSystem
在顶层创建它(这样系统就直接成为父系统)因此,在您的情况下,它可能类似于:
或者,您可以在为
ActorSystem
定义Behavior[OrderProcessor.Order]
中使用context.spawn
,然后您将通过system
与actorRef
通信,system
将命令发送到持久参与者。zaqlnxep2#
我理解你的绘画,不幸的是Akka文档只给予了片段作为文档中的样本,他们大多数时候是不完整的,很难理解。
你可以在他们的Github中找到完整的examples,我想你可以通过这种方式更好地理解事情。
如果你想看到一个完整的概念验证应用程序与Akka,我有一个关于它的博客,你可以找到here。