diff --git a/akka-docs/rst/java/code/docs/persistence/LambdaPersistenceDocTest.java b/akka-docs/rst/java/code/docs/persistence/LambdaPersistenceDocTest.java index bb9e42c73b..945713f2de 100644 --- a/akka-docs/rst/java/code/docs/persistence/LambdaPersistenceDocTest.java +++ b/akka-docs/rst/java/code/docs/persistence/LambdaPersistenceDocTest.java @@ -234,13 +234,14 @@ public class LambdaPersistenceDocTest { static Object o4 = new Object() { class MyPersistentActor extends AbstractPersistentActor { + private void updateState(String evt){} + //#save-snapshot private Object state; + private int snapShotInterval = 1000; @Override public Receive createReceive() { return receiveBuilder(). - match(String.class, s -> s.equals("snap"), - s -> saveSnapshot(state)). match(SaveSnapshotSuccess.class, ss -> { SnapshotMetadata metadata = ss.metadata(); // ... @@ -248,6 +249,13 @@ public class LambdaPersistenceDocTest { match(SaveSnapshotFailure.class, sf -> { SnapshotMetadata metadata = sf.metadata(); // ... + }). + match(String.class, cmd -> { + persist( "evt-" + cmd, e -> { + updateState(e); + if (lastSequenceNr() % snapShotInterval == 0 && lastSequenceNr() != 0) + saveSnapshot(state); + }); }).build(); } //#save-snapshot diff --git a/akka-docs/rst/java/code/docs/persistence/PersistentActorExample.java b/akka-docs/rst/java/code/docs/persistence/PersistentActorExample.java index b1dc915c81..b337b1530c 100644 --- a/akka-docs/rst/java/code/docs/persistence/PersistentActorExample.java +++ b/akka-docs/rst/java/code/docs/persistence/PersistentActorExample.java @@ -76,6 +76,7 @@ class ExampleState implements Serializable { class ExamplePersistentActor extends AbstractPersistentActor { private ExampleState state = new ExampleState(); + private int snapShotInterval = 1000; public int getNumEvents() { return state.size(); @@ -97,16 +98,15 @@ class ExamplePersistentActor extends AbstractPersistentActor { return receiveBuilder() .match(Cmd.class, c -> { final String data = c.getData(); - final Evt evt1 = new Evt(data + "-" + getNumEvents()); - final Evt evt2 = new Evt(data + "-" + (getNumEvents() + 1)); - persistAll(asList(evt1, evt2), (Evt evt) -> { - state.update(evt); - if (evt.equals(evt2)) { - getContext().system().eventStream().publish(evt); - } + final Evt evt = new Evt(data + "-" + getNumEvents()); + persist(evt, (Evt e) -> { + state.update(e); + getContext().system().eventStream().publish(e); + if (lastSequenceNr() % snapShotInterval == 0 && lastSequenceNr() != 0) + // 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)) .build(); } @@ -120,7 +120,6 @@ public class PersistentActorExample { persistentActor.tell(new Cmd("foo"), null); persistentActor.tell(new Cmd("baz"), null); persistentActor.tell(new Cmd("bar"), null); - persistentActor.tell("snap", null); persistentActor.tell(new Cmd("buzz"), null); persistentActor.tell("print", null); diff --git a/akka-docs/rst/scala/code/docs/persistence/PersistenceDocSpec.scala b/akka-docs/rst/scala/code/docs/persistence/PersistenceDocSpec.scala index e71faa34a6..b60fe923d9 100644 --- a/akka-docs/rst/scala/code/docs/persistence/PersistenceDocSpec.scala +++ b/akka-docs/rst/scala/code/docs/persistence/PersistenceDocSpec.scala @@ -159,13 +159,21 @@ object PersistenceDocSpec { class MyPersistentActor extends PersistentActor { override def persistenceId = "my-stable-persistence-id" + def updateState(event: String): Unit = {} + //#save-snapshot var state: Any = _ + val snapShotInterval = 1000 override def receiveCommand: Receive = { - case "snap" => saveSnapshot(state) case SaveSnapshotSuccess(metadata) => // ... case SaveSnapshotFailure(metadata, reason) => // ... + case cmd: String => + persist(s"evt-$cmd") { e => + updateState(e) + if (lastSequenceNr % snapShotInterval == 0 && lastSequenceNr != 0) + saveSnapshot(state) + } } //#save-snapshot diff --git a/akka-docs/rst/scala/code/docs/persistence/PersistentActorExample.scala b/akka-docs/rst/scala/code/docs/persistence/PersistentActorExample.scala index 19635bfd7c..5ea21796e3 100644 --- a/akka-docs/rst/scala/code/docs/persistence/PersistentActorExample.scala +++ b/akka-docs/rst/scala/code/docs/persistence/PersistentActorExample.scala @@ -29,14 +29,15 @@ class ExamplePersistentActor extends PersistentActor { case SnapshotOffer(_, snapshot: ExampleState) => state = snapshot } + val snapShotInterval = 1000 val receiveCommand: Receive = { case Cmd(data) => - persist(Evt(s"${data}-${numEvents}"))(updateState) - persist(Evt(s"${data}-${numEvents + 1}")) { event => + persist(Evt(s"${data}-${numEvents}")) { event => updateState(event) context.system.eventStream.publish(event) + if (lastSequenceNr % snapShotInterval == 0 && lastSequenceNr != 0) + saveSnapshot(state) } - case "snap" => saveSnapshot(state) case "print" => println(state) } @@ -51,7 +52,6 @@ object PersistentActorExample extends App { persistentActor ! Cmd("foo") persistentActor ! Cmd("baz") persistentActor ! Cmd("bar") - persistentActor ! "snap" persistentActor ! Cmd("buzz") persistentActor ! "print"