/// <summary> /// Removes all entries from the worker availability queue /// with the specified address. /// </summary> /// <param name="address"> /// The address of the worker to remove from the availability list. /// </param> public void ClearAvailabilityForWorker(Address address) { var existing = storageQueue.GetAllMessages(); foreach (var m in existing) { if (MsmqUtilities.GetIndependentAddressForQueue(m.ResponseQueue) == address) { storageQueue.ReceiveById(m.Id, MessageQueueTransactionType.Automatic); } } }
/// <summary> /// Pops the next available worker from the available worker queue /// and returns its address. /// </summary> public Address PopAvailableWorker() { try { var m = storageQueue.Receive(TimeSpan.Zero, MessageQueueTransactionType.Automatic); if (m == null) { return(null); } return(MsmqUtilities.GetIndependentAddressForQueue(m.ResponseQueue)); } catch (Exception) { return(null); } }
/// <summary> /// Removes all entries from the worker availability queue /// with the specified address. /// </summary> /// <param name="address"> /// The address of the worker to remove from the availability list. /// </param> public void ClearAvailabilityForWorker(Address address) { lock (lockObject) { var messages = storageQueue.GetAllMessages(); foreach (var m in messages.Where(m => MsmqUtilities.GetIndependentAddressForQueue(m.ResponseQueue) == address)) { if (UnitOfWork.HasActiveTransaction()) { storageQueue.ReceiveById(m.Id, UnitOfWork.Transaction); } else { storageQueue.ReceiveById(m.Id, MessageQueueTransactionType.Automatic); } } } }
/// <summary> /// Converts an MSMQ <see cref="Message"/> into an NServiceBus message. /// </summary> /// <param name="m">The MSMQ message to convert.</param> /// <returns>An NServiceBus message.</returns> public TransportMessage Convert(Message m) { var result = new TransportMessage { Id = m.Id, CorrelationId = (m.CorrelationId == "00000000-0000-0000-0000-000000000000\\0" ? null : m.CorrelationId), Recoverable = m.Recoverable, TimeToBeReceived = m.TimeToBeReceived, TimeSent = m.SentTime, ReturnAddress = MsmqUtilities.GetIndependentAddressForQueue(m.ResponseQueue), MessageIntent = Enum.IsDefined(typeof(MessageIntentEnum), m.AppSpecific) ? (MessageIntentEnum)m.AppSpecific : MessageIntentEnum.Send }; FillIdForCorrelationAndWindowsIdentity(result, m); if (string.IsNullOrEmpty(result.IdForCorrelation)) { result.IdForCorrelation = result.Id; } if (m.Extension.Length > 0) { var stream = new MemoryStream(m.Extension); var o = _headerSerializer.Deserialize(stream); result.Headers = o as List <HeaderInfo>; } else { result.Headers = new List <HeaderInfo>(); } return(result); }
public Address PopAvailableWorker() { if (!Monitor.TryEnter(lockObject)) { return(null); } try { Message availableWorker; if (UnitOfWork.HasActiveTransaction()) { availableWorker = storageQueue.Receive(MaxTimeToWaitForAvailableWorker, UnitOfWork.Transaction); } else { availableWorker = storageQueue.Receive(MaxTimeToWaitForAvailableWorker, MessageQueueTransactionType.Automatic); } if (availableWorker == null) { return(null); } return(MsmqUtilities.GetIndependentAddressForQueue(availableWorker.ResponseQueue)); } catch (Exception) { return(null); } finally { Monitor.Exit(lockObject); } }
public TransportMessage Receive() { try { var m = myQueue.Receive(TimeSpan.FromSeconds(secondsToWait), GetTransactionTypeForReceive()); if (m == null) { return(null); } var result = new TransportMessage { Id = m.Id, CorrelationId = (m.CorrelationId == "00000000-0000-0000-0000-000000000000\\0" ? null : m.CorrelationId), Recoverable = m.Recoverable, TimeToBeReceived = m.TimeToBeReceived, TimeSent = m.SentTime, ReturnAddress = MsmqUtilities.GetIndependentAddressForQueue(m.ResponseQueue), MessageIntent = Enum.IsDefined(typeof(MessageIntentEnum), m.AppSpecific) ? (MessageIntentEnum)m.AppSpecific : MessageIntentEnum.Send }; m.BodyStream.Position = 0; result.Body = new byte[m.BodyStream.Length]; m.BodyStream.Read(result.Body, 0, result.Body.Length); result.Headers = new Dictionary <string, string>(); if (m.Extension.Length > 0) { var stream = new MemoryStream(m.Extension); var o = headerSerializer.Deserialize(stream); foreach (var pair in o as List <HeaderInfo> ) { if (pair.Key != null) { result.Headers.Add(pair.Key, pair.Value); } } } result.IdForCorrelation = GetIdForCorrelation(result.Headers); if (result.IdForCorrelation == null) { result.IdForCorrelation = result.Id; } return(result); } catch (MessageQueueException mqe) { if (mqe.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout) { return(null); } if (mqe.MessageQueueErrorCode == MessageQueueErrorCode.AccessDenied) { Logger.Fatal(string.Format("Do not have permission to access queue [{0}]. Make sure that the current user [{1}] has permission to Send, Receive, and Peek from this queue. NServiceBus will now exit.", myQueue.QueueName, WindowsIdentity.GetCurrent() != null ? WindowsIdentity.GetCurrent().Name : "unknown user")); Thread.Sleep(10000); //long enough for someone to notice Process.GetCurrentProcess().Kill(); } throw; } }