Akka Persistence:当Command不是简单的状态更新时,Command的执行在哪里

时间:2016-04-07 04:05:15

标签: scala akka-persistence

只是为了澄清:当执行不仅仅是状态更新时(如在线查找的大多数示例中),执行命令的位置在哪里

例如,就我而言,

  • 命令 FetchLastHistoryChangeSet ,它包括根据我们上次停止的位置从外部服务获取最后一个历史记录变更集。换句话说,上一次历史记录ChangeSet Fetched的最新更改时间。

  • 事件将是 HistoryChangeSetFetched(changeSet,time)。与上述内容相关,时间应该是新历史ChangeSet最新更改的时间(根据当前正在处理的命令事件)

现在在我看到的所有示例中,始终是:(i)验证命令,然后,(ii)持久化事件,最后(iii) 处理事件

处理事件我已经看到除了updatestate逻辑之外还添加了自定义代码。其中,通常在更新状态函数之后添加自定义代码。但是这种习惯大多数时候都是关于将消息发送回发送者或将其广播到事件总线。

根据我的例子,很明显我需要做很少的操作来实际调用 Persist (HistoryChangeSetFetched(changeSet,time))。确实,我需要新的变更集,以及最新变更的时间。

我认为可行的唯一方法是在验证命令中进行提取

那是:

case FetchLastHistoryChangeSet => val changetuple = if ValidateCommand(FetchLastHistoryChangeSet) persit(HistoryChangeSetFetched(changetuple._1, changetuple._2)) { historyChangeSetFetched =>
  updateState(historyChangeSetFetched)
}

ValidateCommand(FetchLastHistoryChangeSet)

的位置

将具有逻辑,读取最后的changeSet时间(changeSet的最新更改),基于它获取新的变更集(如果存在),获取其最新更改的时间,并返回元组。

  

我的问题是,它是如何工作的。验证命令   可能是那么复杂的东西?即实际执行   命令?

1 个答案:

答案 0 :(得分:1)

正如文档中所说:"验证可能意味着什么,从简单检查命令消息的字段到与几个外部服务的对话"

所以我认为你要做的事情是完全正确的。任何与外部服务的交互都必须在命令验证阶段完成。