/// <summary> /// A message was received on monitored MSMQ queue /// </summary> /// <param name="receiver">MSMQ Receiver that received the message</param> /// <param name="message">MSMQ Message received</param> /// <remarks> /// We want to now notify the original workflow that subscribed to this /// MSMQ queue that a message was received. For this we need to first copy /// all the relevant data in the MSMQ message into a serializable format /// so we can put it into the WorkflowQueue given to us when /// the subscription was done. /// </remarks> private void OnMessageReceived(Receiver receiver, Message message) { if ( receiver == null ) throw new ArgumentNullException("receiver"); if ( message == null ) throw new ArgumentNullException("message"); try { _lock.AcquireReaderLock(Timeout.Infinite); foreach ( MsmqSubscription subscription in _subscriptionsByID.Values ) { StringComparer comparer = StringComparer.InvariantCultureIgnoreCase; if ( comparer.Compare(subscription.MsmqQueue, message.DestinationQueue.FormatName) == 0 ) { // ensure that each instance gets it's own copy MessageDataEventArgs data = new MessageDataEventArgs(message); NotifyWorkflow(subscription, data); } } } finally { _lock.ReleaseReaderLock(); } }
private void NotifyWorkflow(MsmqSubscription subscription, MessageDataEventArgs data) { TraceUtil.WriteInfo("MsmqListenerService::NotifyWorkflow({0}, {1})", subscription.MsmqQueue, subscription.WfQueueName); WorkflowInstance instance = Runtime.GetWorkflow(subscription.WorkflowInstance); instance.EnqueueItem(subscription.WfQueueName, data, null, null); }