public BurrowConsumer(IModel channel, IMessageHandler messageHandler, IRabbitWatcher watcher, bool autoAck, int batchSize) : base(channel, new SharedQueue()) { if (channel == null) { throw new ArgumentNullException("channel"); } if (messageHandler == null) { throw new ArgumentNullException("messageHandler"); } if (watcher == null) { throw new ArgumentNullException("watcher"); } if (batchSize < 1) { throw new ArgumentNullException("batchSize", "batchSize must be greater than or equal 1"); } Model.ModelShutdown += WhenChannelShutdown; Model.BasicRecoverAsync(true); BatchSize = batchSize; _pool = new Semaphore(BatchSize, BatchSize); _watcher = watcher; _autoAck = autoAck; _messageHandler = messageHandler; _messageHandler.HandlingComplete += MessageHandlerHandlingComplete; _subscriptionCallbackThread = new Thread(_ => { Thread.CurrentThread.Name = string.Format("Consumer thread: {0}", ConsumerTag); while (!_disposed) { try { BasicDeliverEventArgs deliverEventArgs; lock (_sharedQueueLock) { _pool.WaitOne(); deliverEventArgs = (BasicDeliverEventArgs) Queue.Dequeue(); } if (deliverEventArgs != null) { _messageHandler.BeforeHandlingMessage(this, deliverEventArgs); HandleMessageDelivery(deliverEventArgs); } } catch(ThreadAbortException) { _watcher.WarnFormat("The consumer thread {0} is aborted", ConsumerTag); } catch (EndOfStreamException) { // do nothing here, EOS fired when queue is closed // Looks like the connection has gone away, so wait a little while // before continuing to poll the queue Thread.Sleep(10); } } }); _subscriptionCallbackThread.Start(); }