2013-10-08 11:46:02 +02:00
|
|
|
/**
|
2013-11-07 10:45:02 +01:00
|
|
|
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
|
2013-10-08 11:46:02 +02:00
|
|
|
* Copyright (C) 2012-2013 Eligotech BV.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package akka.persistence.snapshot
|
|
|
|
|
|
|
|
|
|
import scala.concurrent.Future
|
|
|
|
|
|
|
|
|
|
import akka.actor._
|
|
|
|
|
import akka.pattern.pipe
|
|
|
|
|
import akka.persistence._
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Abstract snapshot store.
|
|
|
|
|
*/
|
|
|
|
|
trait SnapshotStore extends Actor {
|
|
|
|
|
import SnapshotProtocol._
|
|
|
|
|
import context.dispatcher
|
|
|
|
|
|
|
|
|
|
final def receive = {
|
|
|
|
|
case LoadSnapshot(processorId, criteria, toSequenceNr) ⇒ {
|
|
|
|
|
val p = sender
|
|
|
|
|
loadAsync(processorId, criteria.limit(toSequenceNr)) map {
|
|
|
|
|
sso ⇒ LoadSnapshotResult(sso, toSequenceNr)
|
|
|
|
|
} recover {
|
|
|
|
|
case e ⇒ LoadSnapshotResult(None, toSequenceNr)
|
|
|
|
|
} pipeTo (p)
|
|
|
|
|
}
|
|
|
|
|
case SaveSnapshot(metadata, snapshot) ⇒ {
|
|
|
|
|
val p = sender
|
|
|
|
|
val md = metadata.copy(timestamp = System.currentTimeMillis)
|
|
|
|
|
saveAsync(md, snapshot) map {
|
|
|
|
|
_ ⇒ SaveSnapshotSuccess(md)
|
|
|
|
|
} recover {
|
|
|
|
|
case e ⇒ SaveSnapshotFailure(metadata, e)
|
|
|
|
|
} to (self, p)
|
|
|
|
|
}
|
|
|
|
|
case evt @ SaveSnapshotSuccess(metadata) ⇒ {
|
|
|
|
|
saved(metadata)
|
|
|
|
|
sender ! evt // sender is processor
|
|
|
|
|
}
|
|
|
|
|
case evt @ SaveSnapshotFailure(metadata, _) ⇒ {
|
|
|
|
|
delete(metadata)
|
|
|
|
|
sender ! evt // sender is processor
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//#snapshot-store-plugin-api
|
|
|
|
|
/**
|
2013-11-07 10:45:02 +01:00
|
|
|
* Plugin API: asynchronously loads a snapshot.
|
2013-10-08 11:46:02 +02:00
|
|
|
*
|
|
|
|
|
* @param processorId processor id.
|
|
|
|
|
* @param criteria selection criteria for loading.
|
|
|
|
|
*/
|
|
|
|
|
def loadAsync(processorId: String, criteria: SnapshotSelectionCriteria): Future[Option[SelectedSnapshot]]
|
|
|
|
|
|
|
|
|
|
/**
|
2013-11-07 10:45:02 +01:00
|
|
|
* Plugin API: asynchronously saves a snapshot.
|
2013-10-08 11:46:02 +02:00
|
|
|
*
|
|
|
|
|
* @param metadata snapshot metadata.
|
|
|
|
|
* @param snapshot snapshot.
|
|
|
|
|
*/
|
|
|
|
|
def saveAsync(metadata: SnapshotMetadata, snapshot: Any): Future[Unit]
|
|
|
|
|
|
|
|
|
|
/**
|
2013-11-07 10:45:02 +01:00
|
|
|
* Plugin API: called after successful saving of a snapshot.
|
2013-10-08 11:46:02 +02:00
|
|
|
*
|
|
|
|
|
* @param metadata snapshot metadata.
|
|
|
|
|
*/
|
|
|
|
|
def saved(metadata: SnapshotMetadata)
|
|
|
|
|
|
|
|
|
|
/**
|
2013-11-07 10:45:02 +01:00
|
|
|
* Plugin API: deletes the snapshot identified by `metadata`.
|
2013-10-08 11:46:02 +02:00
|
|
|
*
|
|
|
|
|
* @param metadata snapshot metadata.
|
|
|
|
|
*/
|
|
|
|
|
def delete(metadata: SnapshotMetadata)
|
|
|
|
|
//#snapshot-store-plugin-api
|
|
|
|
|
}
|