void AddWorkerToStorageQueue(Worker worker, int capacity = 1)
        {
            using (var returnAddress = new MessageQueue(MsmqUtilities.GetFullPath(worker.Address), false, true, QueueAccessMode.Send))
            {
                var message = new Message
                {
                    Label = worker.SessionId,
                    ResponseQueue = returnAddress
                };

                for (var i = 0; i < capacity; i++)
                {
                    if (UnitOfWork.HasActiveTransaction())
                    {
                        storageQueue.Send(message, UnitOfWork.Transaction);
                    }
                    else
                    {
                        storageQueue.Send(message, MessageQueueTransactionType.Automatic);
                    }
                }
            }
        }
        public void RegisterNewWorker(Worker worker, int capacity)
        {
            // Need to handle backwards compatibility
            if (worker.SessionId == String.Empty)
            {
                ClearAvailabilityForWorker(worker.Address);
            }

            AddWorkerToStorageQueue(worker, capacity);

            registeredWorkerAddresses[worker.Address] = worker.SessionId;

            Logger.InfoFormat("Worker '{0}' has been registered with {1} capacity.", worker.Address, capacity);
        }
        public void WorkerAvailable(Worker worker)
        {
            string sessionId;

            if (!registeredWorkerAddresses.TryGetValue(worker.Address, out sessionId))
            {
                // Drop ready message as this worker has been disconnected
                // or the worker send us a message before the "WorkerStarting" message

                Logger.InfoFormat("Dropping ready message from worker '{0}', because this worker has been disconnected.", worker.Address);

                return;
            }

            if (sessionId != worker.SessionId)
            {
                // Drop ready message as this message is an extra message that could have been sent because of
                // https://github.com/Particular/NServiceBus/issues/978

                Logger.InfoFormat("Dropping ready message from worker {0}, because this ready message is from an old worker sessionid.", worker.Address);

                return;
            }

            Logger.InfoFormat("Worker '{0}' is available to take on more work.", worker.Address);

            AddWorkerToStorageQueue(worker);
        }
        public void WorkerAvailable(Worker worker)
        {
            string sessionId;

            if (!registeredWorkerAddresses.TryGetValue(worker.Address, out sessionId))
            {
                // The worker send us a message before the "WorkerStarting" message
                Logger.InfoFormat("Dropping ready message from Worker at '{0}', because this worker worker sent us a message before the 'WorkerStarting' message.", worker.Address);

                return;
            }

            if (sessionId.Equals("disconnected"))
            {
                // Drop ready message as this worker has been disconnected 
                Logger.InfoFormat("Dropping ready message from Worker at '{0}', because this worker has been disconnected.", worker.Address);

                return;
            }

            Logger.InfoFormat("Worker at '{0}' is available to take on more work.", worker.Address);

            AddWorkerToStorageQueue(worker);
        }