/// <summary> /// Constracor /// </summary> public Processor() { ProcessorQueue = new ProcessorQueue(); impersonate = new Impersonation(); impersonate.ImpersonationLogonType = WorkflowEngine.Common.Security.ImpersonationLogonType.LOGON32_LOGON_NEW_CREDENTIALS; if (Utils.PROCESSOR_COUNT > 1 && EngineConfiguration.UsePipelinedOnMulticore) executor = new PipelinedExecutor(); else executor = new SequentialExecutor(); }
public static void HandleComplete(ProcessorQueue processorQueue, IWorkflowMessage message) { MessageQueue completedQueue = new System.Messaging.MessageQueue(processorQueue.CompletedQueue); using (TransactionScope txScope = new TransactionScope(TransactionScopeOption.RequiresNew)) { try { completedQueue.Send(message, MessageQueueTransactionType.Automatic); txScope.Complete(); } catch (InvalidOperationException) { } finally { completedQueue.Dispose(); } } }
/// <summary> /// Load the Job's Queues /// </summary> /// <param name="processorJob">The ProcessorJob to load to</param> /// <param name="queuesNode">The XmlNode to load from</param> private static void LoadJobQueues(ProcessorJob processorJob, XmlNode queuesNode) { foreach (XmlNode queueNode in queuesNode.ChildNodes) { ProcessorQueue processorQueue = new ProcessorQueue(); if (!string.IsNullOrEmpty(queueNode.Attributes["MessageQueue"].Value)) //Required processorQueue.MessageQueue = queueNode.Attributes["MessageQueue"].Value; if (!string.IsNullOrEmpty(queueNode.Attributes["ErrorQueue"].Value)) //Required processorQueue.ErrorQueue = queueNode.Attributes["ErrorQueue"].Value; if (!string.IsNullOrEmpty(queueNode.Attributes["PoisonQueue"].Value)) //Required processorQueue.PoisonQueue = queueNode.Attributes["PoisonQueue"].Value; if (!string.IsNullOrEmpty(queueNode.Attributes["CompletedQueue"].Value)) //Required processorQueue.CompletedQueue = queueNode.Attributes["CompletedQueue"].Value; if (!string.IsNullOrEmpty(queueNode.Attributes["MessageQueueType"].Value)) //Required processorQueue.MessageQueueType = (MessageQueueType)Enum.Parse(typeof(MessageQueueType), queueNode.Attributes["MessageQueueType"].Value, true); processorJob.ProcessorQueues.Add(processorQueue); } }
/// <summary> /// Get the currently active Queue to pickup or deliver messages /// </summary> /// <param name="processorJob">The current loaded configuration</param> /// <param name="queueOperationType">The type of operation to execute on the Queue</param> /// <returns>The current active ProcessorQueue for the Operation Type</returns> public static ProcessorQueue GetActiveQueue(ProcessorJob processorJob, QueueOperationType queueOperationType) { // For backward compatibility if the master Queue is present return it if (!string.IsNullOrEmpty(processorJob.MessageQueue) && !string.IsNullOrEmpty(processorJob.ErrorQueue)) return new ProcessorQueue() { MessageQueue = processorJob.MessageQueue, ErrorQueue = processorJob.ErrorQueue, PoisonQueue = processorJob.PoisonQueue, CompletedQueue = processorJob.CompletedQueue, MessageQueueType = processorJob.MessageQueueType }; //If this is a delivery, deliver to the first available queue //If this is a pickup, pick it from the queues in a reverse order // Get the first queue with messages ProcessorQueue queue = new ProcessorQueue(); lock (activeQueueSearchLock) { if (queueOperationType == QueueOperationType.Pickup) processorJob.ProcessorQueues.Reverse(); foreach (ProcessorQueue processorQueue in processorJob.ProcessorQueues) { MessageQueue workflowQueue = new MessageQueue(processorQueue.MessageQueue); queue = processorQueue; try { using (MessageQueue msmq = new MessageQueue(processorQueue.MessageQueue)) { msmq.Peek(new TimeSpan(0)); break; } } catch (MessageQueueException e) { if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout) { // The queue is is available and empty it can be used for delivery if (queueOperationType == QueueOperationType.Delivery) break; } } catch (Exception) { } } // Reverse the queue list back to the original order if (queueOperationType == QueueOperationType.Pickup) processorJob.ProcessorQueues.Reverse(); } return queue; }