Beispiel #1
0
        public void Execute(AutoResetEvent block)
        {
            const int filesToCreate  = 100;
            var       filesProcessed = 0;

            // This setup will emit files on another thread
            var producesInts = new ObservingProducer <int>();

            producesInts.Produces(Observable.Range(1, filesToCreate)).Attach(new FileConsumer <int>());
            producesInts.Start();

            // This setup will output the contents of loaded files to the console
            var fileProducer = new FileProducer <int>();
            var logger       = new ActionConsumer <int>(i =>
            {
                filesProcessed++;
                Console.WriteLine(filesProcessed);
                if (filesProcessed >= filesToCreate)
                {
                    block.Set();
                }
            });

            fileProducer.Attach(logger);
            fileProducer.Start();
        }
        /// <summary>
        /// Perform a request/response
        /// </summary>
        /// <typeparam name="TMessage">The type of the message being sent</typeparam>
        /// <typeparam name="TEvent">The type of the event for the response</typeparam>
        /// <param name="bus">The bus to send/receive from</param>
        /// <param name="message">The message to send</param>
        /// <param name="cancellationToken">CancellationToken to use to cancel or timeout.</param>
        /// <returns>The event response</returns>
        public static Task <TEvent> RequestAsync <TMessage, TEvent>(this IBus bus, TMessage message, CancellationToken cancellationToken) where TMessage : IMessage
            where TEvent : IEvent
        {
            if (bus == null)
            {
                throw new ArgumentNullException(nameof(bus));
            }
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            var tcs = new TaskCompletionSource <TEvent>();

            cancellationToken.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: false);
            ActionConsumer <TEvent> actionConsumer = null;

            actionConsumer = new ActionConsumer <TEvent>(e =>
            {
                if (actionConsumer != null)
                {
                    bus.RemoveHandler(actionConsumer);
                }
                tcs.SetResult(e);
            });
            bus.AddHandler(actionConsumer);
            bus.Send(message);
            return(tcs.Task);
        }
Beispiel #3
0
 public void NullDelegateCausesException()
 {
     Assert.Throws <ArgumentNullException>(() =>
     {
         var ac = new ActionConsumer <IMessage>(null);
     });
 }
        public void RemovingHandlerBeforeProcessingThrows()
        {
            var bus            = new Bus();
            var actionConsumer = new ActionConsumer <Message1>(m => { });
            var token          = bus.AddHandler(actionConsumer);

            Assert.Throws <MessageHandlerRemovedBeforeProcessingMessageException <Message1> >(() => bus.RemoveHandler(actionConsumer, token));
        }
Beispiel #5
0
        public void Execute(AutoResetEvent block)
        {
            var producer = new ObservingProducer <int>();
            var consumer = new ActionConsumer <int>(i => Console.WriteLine(i));

            producer.Attach(consumer);
            producer.Produces(Observable.Range(1, 10000), onCompleted: () => block.Set());
            producer.Start();
        }
        public void RemoveHandlerTwiceSucceeds()
        {
            var bus             = new Bus();
            var actionConsumer1 = new ActionConsumer <Message1>(m => { });
            var token1          = bus.AddHandler(actionConsumer1);

            bus.Send(new Message1());
            bus.RemoveHandler(actionConsumer1, token1);
            bus.RemoveHandler(actionConsumer1, token1);
        }
Beispiel #7
0
        public void InterleavedRemoveHandlerRemovesCorrectHandler()
        {
            string ordinal         = null;
            var    bus             = new Bus();
            var    actionConsumer1 = new ActionConsumer <Message1>(m => ordinal = "1");
            var    token1          = bus.AddHandler(actionConsumer1);
            var    actionConsumer2 = new ActionConsumer <Message1>(m => ordinal = "2");
            var    token2          = bus.AddHandler(actionConsumer2);

            bus.RemoveHandler(actionConsumer1, token1);
            bus.Send(new Message1());
            Assert.AreEqual("2", ordinal);
        }
Beispiel #8
0
        public void Execute(AutoResetEvent block)
        {
            var producer = new ObservingProducer <int>();
            var consumer = new ActionConsumer <int>(i => Console.WriteLine(i));

            var serializer = new BinarySerializer();
            var outbound   = new ProtocolProducer <int>(serializer); // This is a producer of a data stream that consumes T events (serializer)
            var inbound    = new ProtocolConsumer <int>(serializer); // This is a consumer of a data stream that produces T events (deserializer)

            outbound.Attach(inbound);                                // Typically you'd put an enqueing consumer here to shuttle serialized events off-network
            inbound.Attach(consumer);

            producer.Attach(outbound);
            producer.Produces(Observable.Range(1, 10000), onCompleted: () => block.Set());
            producer.Start();
        }
        private BackgroundThreadProducer(BlockingCollection <T> source, bool @internal = true)
        {
            _buffer   = source;
            _internal = @internal;

            MaxDegreeOfParallelism = 1;

            _uptime = new Stopwatch();
            _cancel = new CancellationTokenSource();
            _empty  = new SemaphoreSlim(1);

            var devNull = new ActionConsumer <QueuedMessage <T> >(message => { });

            _consumer              = devNull;
            _backlogConsumer       = devNull;
            _undeliverableConsumer = devNull;
        }
        public BackgroundThreadProducer(BlockingCollection <T> source)
        {
            Buffer = source;
            MaxDegreeOfParallelism = 1;

            _uptime = new Stopwatch();
            _cancel = new CancellationTokenSource();
            _empty  = new SemaphoreSlim(1);

            RetryPolicy     = new RetryPolicy();
            RateLimitPolicy = new RateLimitPolicy();

            var devNull = new ActionConsumer <T>(@event => { });

            _consumer              = devNull;
            _backlogConsumer       = devNull;
            _undeliverableConsumer = devNull;
        }
Beispiel #11
0
        public async Task SqsBasic_Consumer_WithProtocol_NoMessages()
        {
            var count   = 0;
            var hitCode = false;

            using (var c = SqsHelper.CreateConnection(this.Logger, SqsSettings.DefaultSection, UnitTestSettingsFile))
            {
                using (var mq1 = new ActionConsumer <Scan>(x => { Interlocked.Increment(ref count); }, c.CreateRetriever(), new ProtoBufOverAmqp <Scan>(), c.CreateConsumer(), this.Logger))
                {
                    await Task.Delay(15000);
                }

                using (var mq2 = new ActionConsumer <Scan>(x => { Interlocked.Increment(ref count); }, c.CreateRetriever(), new ProtoBufOverAmqp <Scan>(), c.CreateConsumer(), this.Logger))
                {
                    mq2.Initialize();
                    await Task.Delay(15000);
                }

                hitCode = true;
            }

            Assert.AreEqual(0, count);
            Assert.IsTrue(hitCode);
        }
Beispiel #12
0
        /// <summary>
        /// Perform a request/response
        /// </summary>
        /// <typeparam name="TMessage">The type of the message being sent</typeparam>
        /// <typeparam name="TSuccessEvent">The type of the event for the response</typeparam>
        /// <param name="bus">The bus to send/receive from</param>
        /// <param name="message">The message to send</param>
        /// <param name="cancellationToken">CancellationToken to use to cancel or timeout.</param>
        /// <returns>The event response</returns>
        public static Task <TSuccessEvent> RequestAsync <TMessage, TSuccessEvent, TErrorEvent>(this IBus bus, TMessage message, CancellationToken cancellationToken) where TMessage : IMessage
            where TSuccessEvent : IEvent
            where TErrorEvent : IEvent
        {
            if (bus == null)
            {
                throw new ArgumentNullException(nameof(bus));
            }
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }

            var tcs = new TaskCompletionSource <TSuccessEvent>();
            ActionConsumer <TSuccessEvent> successActionConsumer = null;
            ActionConsumer <TErrorEvent>   errorActionConsumer   = null;
            object successToken = null;
            object errorToken   = null;

            cancellationToken.Register(() => tcs.TrySetCanceled(), useSynchronizationContext: false);
            {
                successActionConsumer = new ActionConsumer <TSuccessEvent>(e =>
                {
                    try
                    {
                        if (e.CorrelationId != message.CorrelationId)
                        {
                            return;
                        }
                        if (successActionConsumer != null)
                        {
                            bus.RemoveHandler(successActionConsumer, successToken);
                        }
                        if (errorActionConsumer != null)
                        {
                            bus.RemoveHandler(errorActionConsumer, errorToken);
                        }
                        tcs.SetResult(e);
                    }
                    catch (Exception ex)
                    {
                        tcs.SetException(ex);
                    }
                });
                successToken = bus.AddHandler(successActionConsumer);
            }
            {
                errorActionConsumer = new ActionConsumer <TErrorEvent>(e =>
                {
                    try
                    {
                        if (e.CorrelationId != message.CorrelationId)
                        {
                            return;
                        }
                        if (errorActionConsumer != null)
                        {
                            bus.RemoveHandler(errorActionConsumer, errorToken);
                        }
                        if (successActionConsumer != null)
                        {
                            bus.RemoveHandler(successActionConsumer, successToken);
                        }
                        tcs.SetException(new ReceivedErrorEventException <TErrorEvent>(e));
                    }
                    catch (Exception ex)
                    {
                        tcs.SetException(ex);
                    }
                });
                errorToken = bus.AddHandler(errorActionConsumer);
            }
            bus.Send(message);
            return(tcs.Task);
        }