我在理解Akka持久性查询时遇到问题,尤其是方法 eventsByTag ,因为它的行为与我的预期不同。
在我的主课程中,我调用一个类,该类开始监听任何使用某个标记持久保存的事件。
class Account(id: UUID) extends PersistentActor {
override def receiveRecover: Receive = {
case createCheckingsAccount: CreateCheckingsAccount =>
println("Creating checkings account")
}
override def receiveCommand: Receive = {
case createCheckingsAccount: CreateCheckingsAccount =>
persist(Tagged(CheckingsAccountCreated(id), Set("account"))) { event =>
val checkingsAccountCreatedEvent = event.payload.asInstanceOf[CheckingsAccountCreated]
sender ! CreateCheckingsAccountResponse(checkingsAccountCreatedEvent.id.toString)
}
}
def updateState(evt: Event): Unit = {
}
override def persistenceId: String = s"account-$id"
}
每当我启动我的服务器并且我的事件存储空为止并且我坚持我的第一个事件(通过调用http服务,内置在Akka HTTP中)时,事件确实被打印出来。但是,当我重新启动服务器并且事件存储中已经存在事件时,将不会打印新的持久事件。
对此有解释吗?我很难搞清楚为什么会这样。
修改
我正在使用的活动商店是Cassandra。这是PersistentActor(我没有使用事件适配器标记事件,只是将它们包裹在Tagged())
filter
答案 0 :(得分:2)
如果receiveRecover
未执行必要的状态恢复工作,则持久性将无法正常工作。我建议在receiveRecover
中添加一些基本的状态恢复逻辑,并让updateState
方法覆盖标记的事件案例。
我在应用中使用了eventsByTag
,状态恢复逻辑类似于以下内容,并且在新启动和恢复时都能正常工作。
def updateState(e: Any): Unit = e match {
case evt: Event =>
state = state.updated(evt)
case Tagged(evt: Event, _) =>
state = state.updated(evt)
}
...
override def receiveRecover: Receive = {
case evt: Event => updateState(evt)
case taggedEvt: Tagged => updateState(taggedEvt)
}