public void Add(IBatchConsumer batchConsumer, IBatchHandler <T> handler) { var consumerInfo = new ConsumerInfo <T>(batchConsumer, handler); _consumerInfoByHandler[handler] = consumerInfo; _consumerInfoByConsumer[batchConsumer] = consumerInfo; }
///<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)); }
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)); }
public ConsumerInfo(IBatchConsumer batchConsumer, IBatchHandler <T> handler) { BatchConsumer = batchConsumer; Handler = handler; IsEndOfChain = true; }