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();
             }
        }
예제 #4
0
 /// <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);
 }
예제 #5
0
        /// <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;
             }
        }
예제 #6
0
 //
 // 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);
 }
예제 #7
0
        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);
        }
예제 #8
0
 /// <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
 }