Example #1
0
        public void Add(IBatchConsumer batchConsumer, IBatchHandler <T> handler)
        {
            var consumerInfo = new ConsumerInfo <T>(batchConsumer, handler);

            _consumerInfoByHandler[handler]        = consumerInfo;
            _consumerInfoByConsumer[batchConsumer] = consumerInfo;
        }
Example #2
0
        ///<summary>
        /// Specifies a group of consumers that can then be used to build a barrier for dependent consumers.
        /// For example if the handler <code>A</code> must process events before handler <code>B</code>:
        /// <p/>
        /// <pre><code>dw.after(A).consumeWith(B);</code></pre>
        ///</summary>
        ///<param name="handlers">the batch handlers, previously set up with ConsumeWith,
        /// that will form the barrier for subsequent handlers.</param>
        ///<returns> a <see cref="IConsumerGroup{T}"/> that can be used to setup a consumer barrier over the specified consumers.</returns>
        public IConsumerGroup <T> After(params IBatchHandler <T>[] handlers)
        {
            var selectedConsumers = new IBatchConsumer[handlers.Length];

            for (int i = 0; i < handlers.Length; i++)
            {
                var handler = handlers[i];
                selectedConsumers[i] = _consumerRepository.GetConsumerFor(handler);
                if (selectedConsumers[i] == null)
                {
                    throw new InvalidOperationException("Batch handlers must be consuming from the ring buffer before they can be used in a barrier condition.");
                }
            }
            return(new ConsumerGroup <T>(this, selectedConsumers));
        }
Example #3
0
        ConsumerGroup <T> IConsumerBuilder <T> .CreateConsumers(IBatchConsumer[] barrierConsumers, IBatchHandler <T>[] batchHandlers)
        {
            if (_producerBarrier != null)
            {
                throw new InvalidOperationException("Producer Barrier must be initialised after all consumer barriers.");
            }

            var createdConsumers = new IBatchConsumer[batchHandlers.Length];

            for (int i = 0; i < batchHandlers.Length; i++)
            {
                var batchHandler  = batchHandlers[i];
                var barrier       = new ConsumerBarrier <T>(this, barrierConsumers);
                var batchConsumer = new BatchConsumer <T>(barrier, batchHandler);

                _consumerRepository.Add(batchConsumer, batchHandler);
                createdConsumers[i] = batchConsumer;
            }

            _consumerRepository.UnmarkConsumersAsEndOfChain(barrierConsumers);
            return(new ConsumerGroup <T>(this, createdConsumers));
        }
Example #4
0
 public ConsumerInfo(IBatchConsumer batchConsumer, IBatchHandler <T> handler)
 {
     BatchConsumer = batchConsumer;
     Handler       = handler;
     IsEndOfChain  = true;
 }