【问题标题】:Is akka persist callback param just the same intance as persisted eventakka 持久化回调参数是否与持久化事件的实例相同
【发布时间】:2018-02-11 21:43:03
【问题描述】:
def persist[A](event: A)(handler: (A) ⇒ Unit): Unit
def persistAll[A](events: Seq[A])(handler: (A) ⇒ Unit): Unit
对于上述方法,传递给handler的参数是否保证与持久化的event完全相同(具有相同的identifyHashCode)实例?
根据我的几次测试,它们实际上是相同的,但我不知道 akka 是否会在未来的版本中始终确保这一点
【问题讨论】:
标签:
scala
akka
akka-persistence
【解决方案1】:
从源代码中我们可以看出它们是一模一样的。
def persist[A](event: A)(handler: A => Unit): Unit = {
if (recoveryRunning) throw new IllegalStateException("Cannot persist during replay. Events can be persisted when receiving RecoveryCompleted or later.")
pendingStashingPersistInvocations += 1
pendingInvocations addLast StashingHandlerInvocation(event, handler.asInstanceOf[Any => Unit])
eventBatch ::= AtomicWrite(PersistentRepr(event, persistenceId = persistenceId,
sequenceNr = nextSequenceNr(), writerUuid = writerUuid, sender = sender()))
}
您可以看到相同的event 被传递给AtomicWrite 用于持久化,也可以传递给StashingHandlerInvocation 用于处理。我没有看到 akka 团队后来有任何改变这一点的理由。但是,即使是我认为的维护者,也没有人可以承诺未来的发布,也许你需要等待来自 lightbend 的人。仅供参考。