2014-02-15 23:44:00 -05:00
|
|
|
/**
|
|
|
|
|
* Copyright (C) 2009-2014 Typesafe Inc. <http://www.typesafe.com>
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package sample.persistence;
|
|
|
|
|
|
2014-05-21 01:35:21 +02:00
|
|
|
//#persistent-actor-example
|
2014-02-15 23:44:00 -05:00
|
|
|
|
|
|
|
|
import akka.actor.ActorRef;
|
|
|
|
|
import akka.actor.ActorSystem;
|
|
|
|
|
import akka.actor.Props;
|
|
|
|
|
import akka.japi.pf.ReceiveBuilder;
|
2014-05-21 01:35:21 +02:00
|
|
|
import akka.persistence.AbstractPersistentActor;
|
2014-02-15 23:44:00 -05:00
|
|
|
import akka.persistence.SnapshotOffer;
|
|
|
|
|
import scala.PartialFunction;
|
|
|
|
|
import scala.runtime.BoxedUnit;
|
|
|
|
|
|
|
|
|
|
import java.io.Serializable;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
|
|
|
|
import static java.util.Arrays.asList;
|
|
|
|
|
|
|
|
|
|
class Cmd implements Serializable {
|
|
|
|
|
private final String data;
|
|
|
|
|
|
|
|
|
|
public Cmd(String data) {
|
|
|
|
|
this.data = data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public String getData() {
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class Evt implements Serializable {
|
|
|
|
|
private final String data;
|
|
|
|
|
|
|
|
|
|
public Evt(String data) {
|
|
|
|
|
this.data = data;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public String getData() {
|
|
|
|
|
return data;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class ExampleState implements Serializable {
|
|
|
|
|
private final ArrayList<String> events;
|
|
|
|
|
|
|
|
|
|
public ExampleState() {
|
2014-06-03 16:40:44 +02:00
|
|
|
this(new ArrayList<>());
|
2014-02-15 23:44:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ExampleState(ArrayList<String> events) {
|
|
|
|
|
this.events = events;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ExampleState copy() {
|
2014-06-03 16:40:44 +02:00
|
|
|
return new ExampleState(new ArrayList<>(events));
|
2014-02-15 23:44:00 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void update(Evt evt) {
|
|
|
|
|
events.add(evt.getData());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public int size() {
|
|
|
|
|
return events.size();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String toString() {
|
|
|
|
|
return events.toString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-25 12:51:21 +02:00
|
|
|
class ExamplePersistentActor extends AbstractPersistentActor {
|
2014-06-26 13:56:01 +02:00
|
|
|
|
2014-02-15 23:44:00 -05:00
|
|
|
private ExampleState state = new ExampleState();
|
|
|
|
|
|
|
|
|
|
public int getNumEvents() {
|
|
|
|
|
return state.size();
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-26 13:56:01 +02:00
|
|
|
@Override
|
|
|
|
|
public String persistenceId() { return "sample-id-1"; }
|
|
|
|
|
|
2014-06-25 12:51:21 +02:00
|
|
|
@Override
|
|
|
|
|
public PartialFunction<Object, BoxedUnit> receiveRecover() {
|
2014-02-15 23:44:00 -05:00
|
|
|
return ReceiveBuilder.
|
|
|
|
|
match(Evt.class, state::update).
|
|
|
|
|
match(SnapshotOffer.class, ss -> state = (ExampleState) ss.snapshot()).build();
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-25 12:51:21 +02:00
|
|
|
@Override
|
|
|
|
|
public PartialFunction<Object, BoxedUnit> receiveCommand() {
|
|
|
|
|
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));
|
|
|
|
|
persist(asList(evt1, evt2), (Evt evt) -> {
|
|
|
|
|
state.update(evt);
|
|
|
|
|
if (evt.equals(evt2)) {
|
|
|
|
|
context().system().eventStream().publish(evt);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}).
|
2014-02-15 23:44:00 -05:00
|
|
|
match(String.class, s -> s.equals("snap"), s -> saveSnapshot(state.copy())).
|
2014-06-25 12:51:21 +02:00
|
|
|
match(String.class, s -> s.equals("print"), s -> System.out.println(state)).
|
|
|
|
|
build();
|
2014-02-15 23:44:00 -05:00
|
|
|
}
|
2014-06-25 12:51:21 +02:00
|
|
|
|
2014-02-15 23:44:00 -05:00
|
|
|
}
|
2014-05-21 01:35:21 +02:00
|
|
|
//#persistent-actor-example
|
2014-02-15 23:44:00 -05:00
|
|
|
|
2014-05-21 01:35:21 +02:00
|
|
|
public class PersistentActorExample {
|
2014-02-15 23:44:00 -05:00
|
|
|
public static void main(String... args) throws Exception {
|
|
|
|
|
final ActorSystem system = ActorSystem.create("example");
|
2014-06-25 12:51:21 +02:00
|
|
|
final ActorRef processor = system.actorOf(Props.create(ExamplePersistentActor.class), "processor-4-java8");
|
2014-02-15 23:44:00 -05:00
|
|
|
processor.tell(new Cmd("foo"), null);
|
|
|
|
|
processor.tell(new Cmd("baz"), null);
|
|
|
|
|
processor.tell(new Cmd("bar"), null);
|
|
|
|
|
processor.tell("snap", null);
|
|
|
|
|
processor.tell(new Cmd("buzz"), null);
|
|
|
|
|
processor.tell("print", null);
|
|
|
|
|
|
|
|
|
|
Thread.sleep(1000);
|
|
|
|
|
system.shutdown();
|
|
|
|
|
}
|
|
|
|
|
}
|