public RetryStartupAndShutdownTasks()
 {
     executor = new PeriodicExecutor(
         AdoptOrphanedBatches,
         TimeSpan.FromMinutes(2)
     );
 }
 public void If_execution_takes_longer_than_period_it_triggers_next_execution_immediately_after_previous()
 {
     var counter = 0;
     var failure = false;
     var lastEndTime = DateTime.MinValue;
     var @event = new ManualResetEventSlim(false);
     var delay = TimeSpan.Zero;
     var executor = new PeriodicExecutor(ex =>
     {
         delay = DateTime.Now - lastEndTime;
         if (lastEndTime != DateTime.MinValue && delay > TimeSpan.FromMilliseconds(100))
         {
             @event.Set();
             failure = true;
             return;
         }
         counter++;
         Thread.Sleep(2000);
         lastEndTime = DateTime.Now;
         if (counter == 2)
         {
             @event.Set();
         }
     }, TimeSpan.FromSeconds(1));
     executor.Start(true);
     @event.Wait();
     executor.Stop();
     Assert.IsFalse(failure, string.Format("Time between finishing previous execution and starting this longer than {0} ms",delay));
 }
예제 #3
0
 public RetryProcessor(IBodyStorage bodyStorage, ISendMessages sender, IDocumentStore store, IBus bus, ReturnToSenderDequeuer returnToSender)
 {
     executor = new PeriodicExecutor(Process, TimeSpan.FromSeconds(30), ex => Log.Error("Error during retry batch processing", ex));
     this.bodyStorage = bodyStorage;
     this.sender = sender;
     this.store = store;
     this.bus = bus;
     this.returnToSender = returnToSender;
 }
 public void Can_shutdown_while_waiting()
 {
     var @event = new ManualResetEventSlim(false);
     var executor = new PeriodicExecutor(ex => @event.Set(), TimeSpan.FromSeconds(10000));
     executor.Start(false);
     @event.Wait();
     Thread.Sleep(1000);
     executor.Stop();
     Assert.Pass();
 }
        private void AdoptOrphanedBatches(PeriodicExecutor ex)
        {
            var allDone = true;
            if (RetryDocumentManager != null)
            {
                allDone = RetryDocumentManager.AdoptOrphanedBatches();
            }

            if (allDone)
            {
                executor.Stop();
            }
        }
 public void If_execution_throws_it_does_not_kill_the_executor()
 {
     var first = true;
     var success = false;
     var @event = new ManualResetEventSlim(false);
     var executor = new PeriodicExecutor(ex =>
     {
         if (first)
         {
             first = false;
             throw new Exception();
         }
         success = true;
         @event.Set();
     }, TimeSpan.FromSeconds(1));
     executor.Start(true);
     @event.Wait();
     executor.Stop();
     Assert.IsTrue(success);
 }
예제 #7
0
 void Process(PeriodicExecutor e)
 {
     bool batchesProcessed;
     do
     {
         using (var session = store.OpenSession())
         {
             batchesProcessed = ProcessBatches(session);
             session.SaveChanges();
         }
     } while (batchesProcessed && !e.IsCancellationRequested);
 }