如何在 Lagom 中实现 "expires after" 副作用?
How to implement an "expires after" side effect in Lagom?
我是第一次接触 Lagom + CQRS/Event 采购,我想实现如下行为:
- 执行服务调用(例如通过 REST API 调用)
- 一个命令是 运行 并触发一个改变状态的事件(例如启动某种计时器)。
- 在预定义的时间间隔后,计时器应该到期,因此应该触发一个新事件(没有其他外部命令)来改变状态以使计时器无效。
前两个步骤很简单,但是一旦我触发了 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 从注册表和 运行 命令中取出,就像正常的服务调用一样。
我是第一次接触 Lagom + CQRS/Event 采购,我想实现如下行为:
- 执行服务调用(例如通过 REST API 调用)
- 一个命令是 运行 并触发一个改变状态的事件(例如启动某种计时器)。
- 在预定义的时间间隔后,计时器应该到期,因此应该触发一个新事件(没有其他外部命令)来改变状态以使计时器无效。
前两个步骤很简单,但是一旦我触发了 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 从注册表和 运行 命令中取出,就像正常的服务调用一样。