如何在 Lagom 中实现 "expires after" 副作用?

How to implement an "expires after" side effect in Lagom?

我是第一次接触 Lagom + CQRS/Event 采购,我想实现如下行为:

  1. 执行服务调用(例如通过 REST API 调用)
  2. 一个命令是 运行 并触发一个改变状态的事件(例如启动某种计时器)。
  3. 在预定义的时间间隔后,计时器应该到期,因此应该触发一个新事件(没有其他外部命令)来改变状态以使计时器无效。

前两个步骤很简单,但是一旦我触发了 TimerStartedEvent 并改变了状态,我如何 "schedule" 在固定的时间后发生事件?如何实施第三步?

我找到了一个可能的实现(实际上是 online-auction-scala sample code 本身)。

因为 Lagom 是建立在 Akka 之上的,它注入了 ActorSystem,所以你可以使用 system.scheduler.schedule 调用来安排未来的事情。

为了回答问题的 CQRS 部分,示例代码执行如下操作:

system.scheduler.scheduler(offset, delay) {
  checkFinishBidding()
}

checkFinishBidding() = {
  registry.refFor[Entity](id).ask(SomeCommand)
}

因此,当时间触发时,您可以将实体 ref 从注册表和 运行 命令中取出,就像正常的服务调用一样。