Page History
...
Code Block | ||||
---|---|---|---|---|
| ||||
final case class SnapshotMetadata(persistenceId: String, sequenceNr: Long, timestamp: Long = 0L) @Component @Scope("prototype") public class SnapShotActor extends AbstractPersistentActor { private final LoggingAdapter log = Logging.getLogger(getContext().system(), "AbstractPersistentActor"); private Object state; private int snapShotInterval = 5; @Override public String persistenceId() { return "ExamplePersistentActor-id-1"; } @Override public Receive createReceiveRecover() { return receiveBuilder(). = 1000; match(SnapshotOffer.class, s -> { state = s.snapshot(); //상태복원 // ... }). match(String.class, s -> {/* ...*/}).build(); } // 스냅샷을 지원하는 메시지 정의 @Override public Receive createReceive() { return receiveBuilder(). match(SaveSnapshotSuccess.class, ss -> { SnapshotMetadata metadata = ss.metadata(); // ... }). match(SaveSnapshotFailure.class, sf -> { SnapshotMetadata metadata = sf.metadata(); // ... }). matchEquals("print", s -> System.out.println(state) ). //마지막 상태확인 match(String.class, cmd -> { persist( "evt-" + cmd, e -> { log.info("EventFired:"+cmd); state updateState(e); = "MyState" + cmd; if (lastSequenceNr() % snapShotInterval == 0 && lastSequenceNr() != 0) saveSnapshot(state); //이벤트가 5회 발생할때마다 스냅샷을 찍음 log.info("SaveSnapShot"); } saveSnapshot(state); }) .build(); } } |
스냅샷 저장에 필요한 메타정의(SnapshotMetadata) 후 자신이 원하는 타이밍에
카메라 셔터(saveSnapshot) 를 누르기만 하면됩니다.
...
마지막 상태를 복원(SnapshotOffer)할수도 있고,
각 시간대별 스냅샷은 고유 아이디가 존재함으로
특정 스냅샷(SnapshotSelectionCriteria)을 복원할수도 있습니다.
스냅샷 테스트
Code Block | ||||
---|---|---|---|---|
| ||||
스냅샷 시도에따른 반응 메시지
Method | Success | Failure message |
---|---|---|
saveSnapshot(Any) | SaveSnapshotSuccess | SaveSnapshotFailure |
deleteSnapshot(Long) | DeleteSnapshotSuccess | DeleteSnapshotFailure |
deleteSnapshots(SnapshotSelectionCriteria) | DeleteSnapshotsSuccess | DeleteSnapshotsFailure |
...