Update Persistence Snapshot documentation (#22419)

* Update Persistence Snapshot documentation (#22233)

* Use copy of ExampleState as it is mutable
This commit is contained in:
Richard Imaoka 2017-03-14 21:30:32 +09:00 committed by Patrik Nordwall
parent e77c3c3e8a
commit ea9617aa25
4 changed files with 31 additions and 16 deletions

View file

@ -234,13 +234,14 @@ public class LambdaPersistenceDocTest {
static Object o4 = new Object() { static Object o4 = new Object() {
class MyPersistentActor extends AbstractPersistentActor { class MyPersistentActor extends AbstractPersistentActor {
private void updateState(String evt){}
//#save-snapshot //#save-snapshot
private Object state; private Object state;
private int snapShotInterval = 1000;
@Override public Receive createReceive() { @Override public Receive createReceive() {
return receiveBuilder(). return receiveBuilder().
match(String.class, s -> s.equals("snap"),
s -> saveSnapshot(state)).
match(SaveSnapshotSuccess.class, ss -> { match(SaveSnapshotSuccess.class, ss -> {
SnapshotMetadata metadata = ss.metadata(); SnapshotMetadata metadata = ss.metadata();
// ... // ...
@ -248,6 +249,13 @@ public class LambdaPersistenceDocTest {
match(SaveSnapshotFailure.class, sf -> { match(SaveSnapshotFailure.class, sf -> {
SnapshotMetadata metadata = sf.metadata(); SnapshotMetadata metadata = sf.metadata();
// ... // ...
}).
match(String.class, cmd -> {
persist( "evt-" + cmd, e -> {
updateState(e);
if (lastSequenceNr() % snapShotInterval == 0 && lastSequenceNr() != 0)
saveSnapshot(state);
});
}).build(); }).build();
} }
//#save-snapshot //#save-snapshot

View file

@ -76,6 +76,7 @@ class ExampleState implements Serializable {
class ExamplePersistentActor extends AbstractPersistentActor { class ExamplePersistentActor extends AbstractPersistentActor {
private ExampleState state = new ExampleState(); private ExampleState state = new ExampleState();
private int snapShotInterval = 1000;
public int getNumEvents() { public int getNumEvents() {
return state.size(); return state.size();
@ -97,16 +98,15 @@ class ExamplePersistentActor extends AbstractPersistentActor {
return receiveBuilder() return receiveBuilder()
.match(Cmd.class, c -> { .match(Cmd.class, c -> {
final String data = c.getData(); final String data = c.getData();
final Evt evt1 = new Evt(data + "-" + getNumEvents()); final Evt evt = new Evt(data + "-" + getNumEvents());
final Evt evt2 = new Evt(data + "-" + (getNumEvents() + 1)); persist(evt, (Evt e) -> {
persistAll(asList(evt1, evt2), (Evt evt) -> { state.update(e);
state.update(evt); getContext().system().eventStream().publish(e);
if (evt.equals(evt2)) { if (lastSequenceNr() % snapShotInterval == 0 && lastSequenceNr() != 0)
getContext().system().eventStream().publish(evt); // IMPORTANT: create a copy of snapshot because ExampleState is mutable
} saveSnapshot(state.copy());
}); });
}) })
.matchEquals("snap", s -> saveSnapshot(state.copy()))
.matchEquals("print", s -> System.out.println(state)) .matchEquals("print", s -> System.out.println(state))
.build(); .build();
} }
@ -120,7 +120,6 @@ public class PersistentActorExample {
persistentActor.tell(new Cmd("foo"), null); persistentActor.tell(new Cmd("foo"), null);
persistentActor.tell(new Cmd("baz"), null); persistentActor.tell(new Cmd("baz"), null);
persistentActor.tell(new Cmd("bar"), null); persistentActor.tell(new Cmd("bar"), null);
persistentActor.tell("snap", null);
persistentActor.tell(new Cmd("buzz"), null); persistentActor.tell(new Cmd("buzz"), null);
persistentActor.tell("print", null); persistentActor.tell("print", null);

View file

@ -159,13 +159,21 @@ object PersistenceDocSpec {
class MyPersistentActor extends PersistentActor { class MyPersistentActor extends PersistentActor {
override def persistenceId = "my-stable-persistence-id" override def persistenceId = "my-stable-persistence-id"
def updateState(event: String): Unit = {}
//#save-snapshot //#save-snapshot
var state: Any = _ var state: Any = _
val snapShotInterval = 1000
override def receiveCommand: Receive = { override def receiveCommand: Receive = {
case "snap" => saveSnapshot(state)
case SaveSnapshotSuccess(metadata) => // ... case SaveSnapshotSuccess(metadata) => // ...
case SaveSnapshotFailure(metadata, reason) => // ... case SaveSnapshotFailure(metadata, reason) => // ...
case cmd: String =>
persist(s"evt-$cmd") { e =>
updateState(e)
if (lastSequenceNr % snapShotInterval == 0 && lastSequenceNr != 0)
saveSnapshot(state)
}
} }
//#save-snapshot //#save-snapshot

View file

@ -29,14 +29,15 @@ class ExamplePersistentActor extends PersistentActor {
case SnapshotOffer(_, snapshot: ExampleState) => state = snapshot case SnapshotOffer(_, snapshot: ExampleState) => state = snapshot
} }
val snapShotInterval = 1000
val receiveCommand: Receive = { val receiveCommand: Receive = {
case Cmd(data) => case Cmd(data) =>
persist(Evt(s"${data}-${numEvents}"))(updateState) persist(Evt(s"${data}-${numEvents}")) { event =>
persist(Evt(s"${data}-${numEvents + 1}")) { event =>
updateState(event) updateState(event)
context.system.eventStream.publish(event) context.system.eventStream.publish(event)
if (lastSequenceNr % snapShotInterval == 0 && lastSequenceNr != 0)
saveSnapshot(state)
} }
case "snap" => saveSnapshot(state)
case "print" => println(state) case "print" => println(state)
} }
@ -51,7 +52,6 @@ object PersistentActorExample extends App {
persistentActor ! Cmd("foo") persistentActor ! Cmd("foo")
persistentActor ! Cmd("baz") persistentActor ! Cmd("baz")
persistentActor ! Cmd("bar") persistentActor ! Cmd("bar")
persistentActor ! "snap"
persistentActor ! Cmd("buzz") persistentActor ! Cmd("buzz")
persistentActor ! "print" persistentActor ! "print"