Scala akka如何创建事件源的入口点?

cyvaqqii  于 2022-11-05  发布在  Scala
关注(0)|答案(2)|浏览(175)

我一直在努力学习 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

eufgjt7s

eufgjt7s1#

您必须获得ActorRef[MessangeType],才能将MessageType发送给它。
现有参与者具有context(作为具有Behavior定义的参数传递),您可以在其中创建如下所示的子项:

val actorRef = context.spawn(behavior)

但是您也可以从ActorSystem在顶层创建它(这样系统就直接成为父系统)

val actorRef = system.systemActorOf(behavior)

因此,在您的情况下,它可能类似于:

val actorRef = system.systemActorOf(MyPersistentBehavior("test"))
actorRef ! MyPersistentBehavior.Add("test")

或者,您可以在为ActorSystem定义Behavior[OrderProcessor.Order]中使用context.spawn,然后您将通过systemactorRef通信,system将命令发送到持久参与者。

zaqlnxep

zaqlnxep2#

我理解你的绘画,不幸的是Akka文档只给予了片段作为文档中的样本,他们大多数时候是不完整的,很难理解。
你可以在他们的Github中找到完整的examples,我想你可以通过这种方式更好地理解事情。
如果你想看到一个完整的概念验证应用程序与Akka,我有一个关于它的博客,你可以找到here

相关问题