public void run() {
			while (true) {
				try {
					logger.debug("Waiting for new message");
					permits.acquire();
					Message msg = queue.poll();
					if (msg == null) {
						logger.error("Received null message from the queue, programming error??? Ignoring the message");
						break;
					}
					if (msg == poison) {
						logger.info("Received close signal, closing queue:"
								+ name);
						break;
					}
					// Bottleneck prone - Intro multiple thread per set of subscribers
					for (AsyncMessageConsumer subscriber : subscribers) {
						subscriber.onMessage(msg.clone());
						logger.debug("Message sent to a client");
					}
				} catch (InterruptedException e) {
					Thread.currentThread().interrupt();
					break;
				}
			}

		}