=doc #18128 explain PoisonPill interaction with PA
This commit is contained in:
parent
7679b7e63f
commit
8c4cc9a93f
14 changed files with 341 additions and 22 deletions
|
|
@ -13,7 +13,6 @@ import akka.japi.Function;
|
|||
import akka.japi.Procedure;
|
||||
import akka.persistence.*;
|
||||
|
||||
import scala.Option;
|
||||
import java.io.Serializable;
|
||||
|
||||
public class PersistenceDocTest {
|
||||
|
|
@ -504,7 +503,7 @@ public class PersistenceDocTest {
|
|||
}
|
||||
};
|
||||
|
||||
static Object o13 = new Object() {
|
||||
static Object o14 = new Object() {
|
||||
//#view
|
||||
class MyView extends UntypedPersistentView {
|
||||
@Override
|
||||
|
|
@ -534,4 +533,74 @@ public class PersistenceDocTest {
|
|||
//#view-update
|
||||
}
|
||||
};
|
||||
|
||||
static Object o13 = new Object() {
|
||||
//#safe-shutdown
|
||||
final class Shutdown {}
|
||||
|
||||
class MyPersistentActor extends UntypedPersistentActor {
|
||||
@Override
|
||||
public String persistenceId() {
|
||||
return "some-persistence-id";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceiveCommand(Object msg) throws Exception {
|
||||
if (msg instanceof Shutdown) {
|
||||
context().stop(self());
|
||||
} else if (msg instanceof String) {
|
||||
System.out.println(msg);
|
||||
persist("handle-" + msg, new Procedure<String>() {
|
||||
@Override
|
||||
public void apply(String param) throws Exception {
|
||||
System.out.println(param);
|
||||
}
|
||||
});
|
||||
} else unhandled(msg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceiveRecover(Object msg) throws Exception {
|
||||
// handle recovery...
|
||||
}
|
||||
}
|
||||
//#safe-shutdown
|
||||
|
||||
|
||||
public void usage() {
|
||||
final ActorSystem system = ActorSystem.create("example");
|
||||
final ActorRef persistentActor = system.actorOf(Props.create(MyPersistentActor.class));
|
||||
//#safe-shutdown-example-bad
|
||||
// UN-SAFE, due to PersistentActor's command stashing:
|
||||
persistentActor.tell("a", ActorRef.noSender());
|
||||
persistentActor.tell("b", ActorRef.noSender());
|
||||
persistentActor.tell(PoisonPill.getInstance(), ActorRef.noSender());
|
||||
// order of received messages:
|
||||
// a
|
||||
// # b arrives at mailbox, stashing; internal-stash = [b]
|
||||
// # PoisonPill arrives at mailbox, stashing; internal-stash = [b, Shutdown]
|
||||
// PoisonPill is an AutoReceivedMessage, is handled automatically
|
||||
// !! stop !!
|
||||
// Actor is stopped without handling `b` nor the `a` handler!
|
||||
//#safe-shutdown-example-bad
|
||||
|
||||
//#safe-shutdown-example-good
|
||||
// SAFE:
|
||||
persistentActor.tell("a", ActorRef.noSender());
|
||||
persistentActor.tell("b", ActorRef.noSender());
|
||||
persistentActor.tell(new Shutdown(), ActorRef.noSender());
|
||||
// order of received messages:
|
||||
// a
|
||||
// # b arrives at mailbox, stashing; internal-stash = [b]
|
||||
// # Shutdown arrives at mailbox, stashing; internal-stash = [b, Shutdown]
|
||||
// handle-a
|
||||
// # unstashing; internal-stash = [Shutdown]
|
||||
// b
|
||||
// handle-b
|
||||
// # unstashing; internal-stash = []
|
||||
// Shutdown
|
||||
// -- stop --
|
||||
//#safe-shutdown-example-good
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue