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);
    }
Exemplo n.º 3
0
        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());
        }
Exemplo n.º 4
0
        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());
        }