public void AtLeastOnceDeliveryActorSetsDeliverySnapshotDuringRecovery()
        {
            var atLeastOnceDeliverySettings = new PersistenceSettings.AtLeastOnceDeliverySettings(TimeSpan.FromMilliseconds(200), 2, 5, 10);
            // TestActor is the destination actor.
            var alodActorProps = Props.Create <AlodActor>(atLeastOnceDeliverySettings, TestActor);
            var alodActor      = Sys.ActorOf(alodActorProps);

            alodActor.Tell(new Msg("payload"));
            Thread.Sleep(TimeSpan.FromSeconds(1)); // Allow for some retries.
            ExpectMsg <AlodEnvelope>(alode => LastSender.Tell(new Confirmation(alode.DeliveryId)));
            ReceiveWhile <object>(obj => obj as string == "Message delivered!", TimeSpan.FromSeconds(3));
            ReceiveWhile <object>(obj => true, TimeSpan.FromSeconds(3)); // Discard remaining messages.

            alodActor.Tell("snap");
            alodActor.Tell("delete");

            Watch(alodActor);
            alodActor.Tell(PoisonPill.Instance);
            ExpectTerminated(alodActor);
            Unwatch(alodActor);

            alodActor = Sys.ActorOf(alodActorProps);
            ExpectNoMsg(TimeSpan.FromSeconds(5));

            alodActor.Tell("last");
            ExpectMsg <long>(l => l == 1L);
        }
 /// <summary>
 ///     Initializes a new instance of the <see cref="AtLeastOnceDeliverySemantic" /> class.
 /// </summary>
 /// <param name="context">The context of the current actor.</param>
 /// <param name="settings">The Akka.Persistence settings loaded from HOCON configuration.</param>
 public IncrementalAtLeastOnceDeliverySemantic(IActorContext context,
                                               PersistenceSettings.AtLeastOnceDeliverySettings settings)
 {
     _context            = context;
     _settings           = settings;
     _deliverySequenceNr = 0;
 }
            public AlodActor(PersistenceSettings.AtLeastOnceDeliverySettings settings, IActorRef destActor) : base(settings)
            {
                _destActor = destActor;

                Recover <MsgSent>(msgSent => Handler(msgSent));
                Recover <MsgConfirmed>(msgConfirmed => Handler(msgConfirmed, ActorRefs.Nobody));
                Recover <SnapshotOffer>(so =>
                {
                    var delSnap = so.Snapshot as AtLeastOnceDeliverySnapshot;
                    _currDelId  = delSnap !.CurrentDeliveryId;
                    SetDeliverySnapshot(delSnap);
                });

                Command <Msg>(msg => Persist(new MsgSent(msg), Handler));
                Command <Confirmation>(confirmation =>
                                       Persist(new MsgConfirmed(confirmation.DeliveryId), msgConfirmed => Handler(msgConfirmed, Sender)));
                Command <string>(str => str == "print", _ =>
                                 Sender.Tell(string.Join(", ", _confirmedPersistenceIds.Select(l => $"{l} confirmed").ToArray())));
                Command <string>(str => str == "snap", delegate
                {
                    var delSnap = GetDeliverySnapshot();
                    SaveSnapshot(delSnap);
                });
                Command <string>(str => str == "delete", delegate
                {
                    var delSnap = GetDeliverySnapshot();
                    DeleteMessages(delSnap.CurrentDeliveryId);
                });
                Command <string>(str => str == "last", delegate
                {
                    Sender.Tell(_currDelId);
                });
            }