如何在Lagom中实现“过期后”副作用?

时间:2017-02-14 19:15:29

标签: scala akka cqrs event-sourcing lagom

我第一次接近Lagom + CQRS / Event Sourcing,我希望实现以下行为:

  1. 执行服务调用(例如,通过REST API调用)
  2. 运行一个命令并触发一个改变状态的事件(例如启动某种计时器)。
  3. 在预定义的时间间隔之后,计时器应该到期,因此应该触发一个新事件(没有其他外部命令)来改变状态以使计时器无效。
  4. 前两个步骤很简单,但是一旦我触发TimerStartedEvent并改变状态,我如何在一段固定的时间后“安排”一个事件?我如何实施第三步?

1 个答案:

答案 0 :(得分:0)

我找到了一个可能的实现(实际上在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)
}

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