public IEnumerable<MsmqSubscription> LoadAll(string host) { SqlConnection connection = new SqlConnection(_connectionString); using ( connection ) { SqlCommand cmd = new SqlCommand("GetAllMsmqSubscriptions"); cmd.Connection = connection; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@host", host); connection.Open(); using ( SqlDataReader reader = cmd.ExecuteReader() ) { //List<MsmqSubscription> list = new List<MsmqSubscription>(); while ( reader.Read() ) { MsmqSubscription subs = new MsmqSubscription(); subs.ID = reader.GetGuid(0); subs.WorkflowInstance = reader.GetGuid(2); subs.MsmqQueue = reader.GetString(3); subs.WfQueueName = Deserialize(reader.GetSqlBytes(4)); //list.Add(subs); yield return subs; } //return list; } } }
// // IMsmqSubscriptionPersistenceService Implementation // public void Persist(string host, MsmqSubscription subscription) { byte[] wfQueueName = Serialize(subscription.WfQueueName); SqlConnection connection = new SqlConnection(_connectionString); using ( connection ) { SqlCommand cmd = new SqlCommand("InsertMsmqSubscription"); cmd.Connection = connection; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@subscriptionId", subscription.ID); cmd.Parameters.AddWithValue("@host", host); cmd.Parameters.AddWithValue("@workflowInstance", subscription.WorkflowInstance); cmd.Parameters.AddWithValue("@msmqQueue", subscription.MsmqQueue); cmd.Parameters.AddWithValue("@wfQueueName", wfQueueName); connection.Open(); cmd.ExecuteNonQuery(); } }
public void Remove(MsmqSubscription subscription) { SqlConnection connection = new SqlConnection(_connectionString); using ( connection ) { SqlCommand cmd = new SqlCommand("RemoveMsmqSubscription"); cmd.Connection = connection; cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@subscriptionId", subscription.ID); connection.Open(); cmd.ExecuteNonQuery(); } }
/// <summary> /// Remove the specified susbcription /// </summary> /// <param name="subscription">Subscription to remove</param> private void RemoveSubscription(MsmqSubscription subscription) { IMsmqSubscriptionPersistenceService svc = Runtime.GetService<IMsmqSubscriptionPersistenceService>(); svc.Remove(subscription); }
/// <summary> /// Subscribe to messages received from an MSMQ Queue /// </summary> /// <param name="wfQueueName">Workflow Queue to post received messages to</param> /// <param name="msmqQueue">MSMQ Queue to monitor</param> /// <returns>The subscription ID</returns> internal Guid Subscribe(IComparable wfQueueName, string msmqQueue) { if ( wfQueueName == null ) throw new ArgumentNullException("wfQueueName"); if ( String.IsNullOrEmpty(msmqQueue) ) throw new ArgumentNullException("msmqQueue"); MessageQueue queue = new MessageQueue(msmqQueue); MsmqSubscription subscription = new MsmqSubscription(); subscription.WfQueueName = wfQueueName; subscription.MsmqQueue = queue.FormatName; subscription.WorkflowInstance = WorkflowEnvironment.WorkflowInstanceId; using ( TransactionScope scope = new TransactionScope() ) { PersistSubscription(subscription); ActivateSubscription(queue, subscription); scope.Complete(); return subscription.ID; } }
// // Private Methods // /// <summary> /// Persist the specified subscription /// </summary> /// <param name="subscription">Subscription to Persist</param> private void PersistSubscription(MsmqSubscription subscription) { IMsmqSubscriptionPersistenceService svc = Runtime.GetService<IMsmqSubscriptionPersistenceService>(); svc.Persist(_hostname, subscription); }
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); }
/// <summary> /// Activates a subscription by starting /// to listen to the specified queue /// </summary> /// <param name="queue">Queue to activate</param> /// <param name="subscription">Subscription to activate</param> private void ActivateSubscription(MessageQueue queue, MsmqSubscription subscription) { try { _lock.AcquireWriterLock(Timeout.Infinite); _subscriptionsByID.Add(subscription.ID, subscription); // do we already have suscriptions to this queue? Receiver receiver = null; if ( !_queueReceivers.ContainsKey(queue.FormatName) ) { receiver = new Receiver(queue, OnMessageReceived); _queueReceivers.Add(queue.FormatName, receiver); } else { receiver = _queueReceivers[queue.FormatName]; receiver.AddRef(); queue.Dispose(); } } finally { _lock.ReleaseWriterLock(); } }
public void Remove(MsmqSubscription subscription) { // do nothing }
// // IMsmqSubscriptionPersistenceService Implementation // public void Persist(string host, MsmqSubscription subscription) { // do nothing }