コード例 #1
0
        static async Task Main(string[] args)
        {
            Console.Title = "Load Generator";

            var endpointConfiguration = new EndpointConfiguration("LoadGenerator");

            endpointConfiguration.ApplyCommonNServiceBusConfiguration(enableMonitoring: false);
            endpointConfiguration.SendOnly();

            var endpoint = await Endpoint.Start(endpointConfiguration)
                           .ConfigureAwait(false);

            Console.WriteLine("Press ▲/▼ arrows to increase/decrease messages per second");
            Console.WriteLine("Press S to cause a spike of 25 messages");
            Console.WriteLine("Press P to pause/unpause message sending");
            Console.WriteLine("Press ESC key to exit");

            var producer     = new MessageProducer(endpoint);
            var producerTask = producer.Run();

            await UILoop(producer);

            producer.Stop();
            await producerTask;

            await endpoint.Stop()
            .ConfigureAwait(false);
        }
コード例 #2
0
        public void RemoveWorkHandlerLostEventExample()
        {
            int eventSize      = 8;
            var countdownEvent = new CountdownEvent(eventSize);

            var workSequence = new Sequence();

            var disruptor  = new Disruptor <StubEvent>(StubEvent.EventFactory, 4);
            var ringBuffer = disruptor.Start();

            var handler1   = new DynamicHandler(1, countdownEvent);
            var processor1 = new WorkProcessor <StubEvent>(ringBuffer, ringBuffer.NewBarrier(), handler1, new FatalExceptionHandler(), workSequence);

            var handler2   = new DynamicHandler(2, countdownEvent);
            var processor2 = new WorkProcessor <StubEvent>(ringBuffer, ringBuffer.NewBarrier(), handler2, new FatalExceptionHandler(), workSequence);

            ringBuffer.AddGatingSequences(processor1.Sequence);
            Task.Run(() => processor1.Run());

            ringBuffer.AddGatingSequences(processor2.Sequence);
            Task.Run(() => processor2.Run());

            handler1.AwaitStart();
            handler2.AwaitStart();

            Thread.Sleep(10);

            // processor1 should own an unavailable work sequence
            // => this sequence will be dropped by Halt
            processor1.Halt();

            var producer = new MessageProducer(disruptor, InitData(0, eventSize));

            Task.Run(() => producer.Run());
            producer.AwaitStart();

            handler1.AwaitShutdown();

            ringBuffer.RemoveGatingSequence(processor1.Sequence);

            // countdownEvent should not reach zero because of the dropped sequence
            var await = countdownEvent.Wait(TimeSpan.FromMilliseconds(500));

            Assert.IsFalse(await);
        }
コード例 #3
0
        public void RemoveWorkHandlerLaterTest()
        {
            var eventSize      = 8;
            var countdownEvent = new CountdownEvent(eventSize);

            var workSequence = new Sequence();

            var disruptor  = new Disruptor <StubEvent>(StubEvent.EventFactory, 4);
            var ringBuffer = disruptor.Start();

            var handler1   = new DynamicHandler(1, countdownEvent);
            var processor1 = new WorkProcessor <StubEvent>(ringBuffer, ringBuffer.NewBarrier(), handler1, new FatalExceptionHandler(), workSequence);

            var handler2   = new DynamicHandler(2, countdownEvent);
            var processor2 = new WorkProcessor <StubEvent>(ringBuffer, ringBuffer.NewBarrier(), handler2, new FatalExceptionHandler(), workSequence);

            ringBuffer.AddGatingSequences(processor1.Sequence);
            Task.Run(() => processor1.Run());

            ringBuffer.AddGatingSequences(processor2.Sequence);
            Task.Run(() => processor2.Run());

            handler1.AwaitStart();
            handler2.AwaitStart();

            Thread.Sleep(10);

            // processor1 should own an unavailable work sequence
            // => this sequence should not be dropped by HaltLater
            processor1.HaltLater();

            var producer = new MessageProducer(disruptor, InitData(0, eventSize));

            Task.Run(() => producer.Run());
            producer.AwaitStart();

            handler1.AwaitShutdown();

            ringBuffer.RemoveGatingSequence(processor1.Sequence);

            Assert.IsTrue(countdownEvent.Wait(TimeSpan.FromSeconds(3)));
        }