public static async Task <AdvancedProcessingWorker <T> > CreateAndStartAsync(IQueueConsumer consumer,
                                                                                     Action <IEnumerable <T> > batchCallbackAction, ushort batchSize, CancellationToken cancellationToken,
                                                                                     ExceptionHandlingStrategy exceptionHandlingStrategy = ExceptionHandlingStrategy.Requeue,
                                                                                     int invokeRetryCount = 1, int invokeRetryWaitMilliseconds = 0, ILogger logger = null)
        {
            var instance = new AdvancedProcessingWorker <T>(consumer, batchCallbackAction, batchSize, exceptionHandlingStrategy,
                                                            invokeRetryCount, invokeRetryWaitMilliseconds, logger);

            await instance.StartAsync(cancellationToken).ConfigureAwait(false);

            return(instance);
        }
        public static async Task <AdvancedProcessingWorker <T> > CreateAndStartAsync(IQueueClient queueClient,
                                                                                     string queueName, Action <T, RabbitMQConsumerContext> callbackAction, CancellationToken cancellationToken,
                                                                                     ExceptionHandlingStrategy exceptionHandlingStrategy = ExceptionHandlingStrategy.Requeue,
                                                                                     int invokeRetryCount = 1, int invokeRetryWaitMilliseconds = 0,
                                                                                     IConsumerCountManager consumerCountManager = null, IMessageRejectionHandler messageRejectionHandler = null,
                                                                                     ILogger logger = null, ushort prefetchCount = 1)
        {
            var instance = new AdvancedProcessingWorker <T>(queueClient, queueName, callbackAction,
                                                            exceptionHandlingStrategy, invokeRetryCount, invokeRetryWaitMilliseconds, consumerCountManager,
                                                            messageRejectionHandler, logger, prefetchCount);

            await instance.StartAsync(cancellationToken).ConfigureAwait(false);

            return(instance);
        }