2014-02-03 16:08:19 +01:00
|
|
|
package sample.persistence;
|
|
|
|
|
|
2014-06-24 16:57:33 +02:00
|
|
|
import akka.actor.ActorRef;
|
|
|
|
|
import akka.actor.ActorSystem;
|
|
|
|
|
import akka.actor.Props;
|
|
|
|
|
import akka.japi.Procedure;
|
|
|
|
|
import akka.persistence.SnapshotOffer;
|
|
|
|
|
import akka.persistence.UntypedPersistentActor;
|
|
|
|
|
import akka.persistence.UntypedPersistentView;
|
2014-02-03 16:08:19 +01:00
|
|
|
import scala.concurrent.duration.Duration;
|
2014-01-17 06:58:25 +01:00
|
|
|
|
2014-06-24 16:57:33 +02:00
|
|
|
import java.util.concurrent.TimeUnit;
|
2014-01-17 06:58:25 +01:00
|
|
|
|
2014-06-24 16:57:33 +02:00
|
|
|
public class PersistentViewExample {
|
2014-06-25 12:51:21 +02:00
|
|
|
public static class ExamplePersistentActor extends UntypedPersistentActor {
|
|
|
|
|
@Override
|
2014-06-26 13:56:01 +02:00
|
|
|
public String persistenceId() { return "sample-id-4"; }
|
|
|
|
|
|
|
|
|
|
private int count = 1;
|
|
|
|
|
|
2014-01-17 06:58:25 +01:00
|
|
|
@Override
|
2014-06-25 12:51:21 +02:00
|
|
|
public void onReceiveRecover(Object message) {
|
|
|
|
|
if (message instanceof String) {
|
|
|
|
|
count += 1;
|
|
|
|
|
} else {
|
|
|
|
|
unhandled(message);
|
|
|
|
|
}
|
2014-01-17 06:58:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
2014-06-25 12:51:21 +02:00
|
|
|
public void onReceiveCommand(Object message) {
|
|
|
|
|
if (message instanceof String) {
|
|
|
|
|
String s = (String) message;
|
|
|
|
|
System.out.println(String.format("persistentActor received %s (nr = %d)", s, count));
|
|
|
|
|
persist(s + count, new Procedure<String>() {
|
|
|
|
|
public void apply(String evt) {
|
|
|
|
|
count += 1;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
unhandled(message);
|
|
|
|
|
}
|
2014-01-17 06:58:25 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-24 16:57:33 +02:00
|
|
|
public static class ExampleView extends UntypedPersistentView {
|
2014-01-17 06:58:25 +01:00
|
|
|
|
|
|
|
|
private int numReplicated = 0;
|
|
|
|
|
|
2014-06-26 13:56:01 +02:00
|
|
|
@Override public String persistenceId() { return "sample-id-4"; }
|
|
|
|
|
@Override public String viewId() { return "sample-view-id-4"; }
|
2014-01-17 06:58:25 +01:00
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void onReceive(Object message) throws Exception {
|
2014-06-24 16:57:33 +02:00
|
|
|
if (isPersistent()) {
|
2014-01-17 06:58:25 +01:00
|
|
|
numReplicated += 1;
|
2014-06-24 16:57:33 +02:00
|
|
|
System.out.println(String.format("view received %s (num replicated = %d)", message, numReplicated));
|
2014-01-17 06:58:25 +01:00
|
|
|
} else if (message instanceof SnapshotOffer) {
|
|
|
|
|
SnapshotOffer so = (SnapshotOffer)message;
|
|
|
|
|
numReplicated = (Integer)so.snapshot();
|
|
|
|
|
System.out.println(String.format("view received snapshot offer %s (metadata = %s)", numReplicated, so.metadata()));
|
|
|
|
|
} else if (message.equals("snap")) {
|
|
|
|
|
saveSnapshot(numReplicated);
|
2014-06-24 16:57:33 +02:00
|
|
|
} else {
|
|
|
|
|
unhandled(message);
|
2014-01-17 06:58:25 +01: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 persistentActor = system.actorOf(Props.create(ExamplePersistentActor.class));
|
2014-01-17 06:58:25 +01:00
|
|
|
final ActorRef view = system.actorOf(Props.create(ExampleView.class));
|
|
|
|
|
|
2014-06-25 12:51:21 +02:00
|
|
|
system.scheduler().schedule(Duration.Zero(), Duration.create(2, TimeUnit.SECONDS), persistentActor, "scheduled", system.dispatcher(), null);
|
2014-02-03 16:08:19 +01:00
|
|
|
system.scheduler().schedule(Duration.Zero(), Duration.create(5, TimeUnit.SECONDS), view, "snap", system.dispatcher(), null);
|
2014-01-17 06:58:25 +01:00
|
|
|
}
|
|
|
|
|
}
|