public void TestClose() { var testResults = new TestResults(); const int mailboxSize = 64; var dispatcher = new RingBufferDispatcher(mailboxSize, 2, 4); dispatcher.Start(); var mailbox = dispatcher.Mailbox; var actor = new CountTakerActor(testResults); testResults.Until = Until(mailboxSize); for (var count = 1; count <= mailboxSize; ++count) { var countParam = count; Action <ICountTaker> consumer = consumerActor => consumerActor.Take(countParam); mailbox.Send(actor, consumer, null, "Take(int)"); } testResults.Until.Completes(); dispatcher.Close(); const int neverReceived = mailboxSize * 2; for (var count = mailboxSize + 1; count <= neverReceived; ++count) { var countParam = count; Action <ICountTaker> consumer = consumerActor => consumerActor.Take(countParam); mailbox.Send(actor, consumer, null, "Take(int)"); } Until(0).Completes(); Assert.Equal(mailboxSize, testResults.Highest.Get()); }
public IMailbox ProvideMailboxFor(int?hashCode, IDispatcher?dispatcher) { RingBufferDispatcher?maybeDispatcher; if (!hashCode.HasValue) { throw new ArgumentNullException(nameof(hashCode), "Cannot provide mailbox because the hashCode is null."); } if (dispatcher != null) { maybeDispatcher = (RingBufferDispatcher)dispatcher; } else { _dispatchers.TryGetValue(hashCode.Value, out maybeDispatcher); } if (maybeDispatcher == null) { var newDispatcher = new RingBufferDispatcher( _configuration.RingSize, _configuration.FixedBackoff, _configuration.NotifyOnSend, _configuration.DispatcherThrottlingCount); var otherDispatcher = _dispatchers.GetOrAdd(hashCode.Value, newDispatcher); otherDispatcher.Start(); return(otherDispatcher.Mailbox); } return(maybeDispatcher.Mailbox); }
public void TestNotifyOnSendDispatch() { var mailboxSize = 64; var testResults = new TestResults(mailboxSize); var dispatcher = new RingBufferDispatcher(mailboxSize, 1000, true, 4); dispatcher.Start(); var mailbox = dispatcher.Mailbox; var actor = new CountTakerActor(testResults); for (var count = 1; count <= mailboxSize; ++count) { var countParam = count; Action <ICountTaker> consumer = consumerActor => consumerActor.Take(countParam); // notify if in back off mailbox.Send(actor, consumer, null, "take(int)"); // every third message give time for dispatcher to back off if (count % 3 == 0) { Thread.Sleep(50); } } Assert.Equal(mailboxSize, testResults.GetHighest()); }
public void TestBasicDispatch() { const int mailboxSize = 64; var testResults = new TestResults(mailboxSize); var dispatcher = new RingBufferDispatcher(mailboxSize, 2, false, 4); dispatcher.Start(); var mailbox = dispatcher.Mailbox; var actor = new CountTakerActor(testResults); for (var count = 1; count <= mailboxSize; ++count) { var countParam = count; Action <ICountTaker> consumer = consumerActor => consumerActor.Take(countParam); mailbox.Send(actor, consumer, null, "Take(int)"); } Assert.Equal(mailboxSize, testResults.GetHighest()); }
public void TestOverflowDispatch() { var testResults = new TestResults(); const int mailboxSize = 64; const int overflowSize = mailboxSize * 2; var dispatcher = new RingBufferDispatcher(mailboxSize, 2, 4); var mailbox = dispatcher.Mailbox; var actor = new CountTakerActor(testResults); testResults.Until = Until(overflowSize); for (var count = 1; count <= overflowSize; ++count) { var countParam = count; Action <ICountTaker> consumer = consumerActor => consumerActor.Take(countParam); var message = new LocalMessage <ICountTaker>(actor, consumer, "Take(int)"); mailbox.Send(message); } dispatcher.Start(); testResults.Until.Completes(); Assert.Equal(overflowSize, testResults.Highest.Get()); }