/// <summary>
        /// Конструктор для создания <see cref="BatchingTarget{TItem}"/>.
        /// </summary>
        /// <param name="batchTarget">Цель, куда будет отправлена пачка.</param>
        /// <param name="batchSize">Размер пачки.</param>
        /// <param name="forceSendTimeout">Время по ситченеии которого элементы в буфере будут отправлены в цель, даже если <paramref name="batchSize"/> ещё не набран.</param>
        /// <param name="exceptionHandler">Обработчик искючений, которые могут возникнуть во время отправки пачки.</param>
        public BatchingTarget(ITarget <IReadOnlyCollection <TItem> > batchTarget, int batchSize, TimeSpan forceSendTimeout, IExceptionHandler exceptionHandler)
        {
            Contract.Requires <ArgumentNullException>(batchTarget != null);
            Contract.Requires <ArgumentException>(batchSize > 0);
            Contract.Requires <ArgumentException>(forceSendTimeout != TimeSpan.Zero);
            Contract.Requires <ArgumentNullException>(exceptionHandler != null);

            _batchTarget      = batchTarget;
            _exceptionHandler = exceptionHandler;
            _pool             = new BatchPool <TItem>(SendBatch, batchSize, forceSendTimeout);
            _completedTask    = Task.FromResult(true);
        }
Exemple #2
0
        public void BatchPoolShouldFlushAddedItemsAfterTimeout()
        {
            const int itemCount    = 5;
            var       items        = Enumerable.Range(0, itemCount);
            var       flushedItems = new List <int>();

            var batchPool = new BatchPool <int>(flushedItems.AddRange, itemCount - 1, TimeSpan.FromSeconds(0.2));

            foreach (var item in items)
            {
                batchPool.Add(item);
            }

            var isSuccess = batchPool.WaitAsync().Wait(1000);

            Assert.True(isSuccess, "Не дождались результата");
            Assert.AreEqual(items, flushedItems);
        }
Exemple #3
0
        public void BatchPoolShouldFlushAddedItemsWhenThresholdReached()
        {
            const int itemCount = 5;
            var       items     = Enumerable.Range(0, itemCount);

            var taskCancellationSource = new TaskCompletionSource <IReadOnlyCollection <int> >();
            var batchPool = new BatchPool <int>(taskCancellationSource.SetResult, itemCount);

            foreach (var item in items)
            {
                batchPool.Add(item);
            }

            var isSuccess = taskCancellationSource.Task.Wait(1000);

            Assert.True(isSuccess, "Не дождались результата");
            Assert.AreEqual(items, taskCancellationSource.Task.Result);
        }
Exemple #4
0
        public void BatchPoolShouldStopWaitWhenAllFlushOperationsIsEnded()
        {
            const int itemCount          = 5;
            const int expectedFlushCount = 2;

            int flushCount = 0;
            var items      = Enumerable.Range(0, itemCount * expectedFlushCount);
            var batchPool  = new BatchPool <int>(o => Interlocked.Increment(ref flushCount), itemCount);

            foreach (var item in items)
            {
                batchPool.Add(item);
            }

            var isSuccess = batchPool.WaitAsync().Wait(1000);

            Assert.True(isSuccess, "Не дождались результата");
            Assert.AreEqual(expectedFlushCount, flushCount);
        }