private bool MessageDispatcher_RETRY(MessageQueueTransaction mqtx, Message msg, IMessage imsgReq)
        {
            // scope state
            bool         result          = false;
            int          intRetryCounter = 0;
            MessageQueue RetryQueue      = null;

            try
            {
                // check the message state (retry property)
                if (imsgReq.Properties.Contains(MSMQChannelProperties.RetryCounter) &&
                    (imsgReq.Properties[MSMQChannelProperties.RetryCounter] is int))
                {
                    intRetryCounter = Convert.ToInt32(imsgReq.Properties[MSMQChannelProperties.RetryCounter]);
                }

                // check the retry progress
                if (intRetryCounter < RetryCounter)
                {
                    // update message state
                    imsgReq.Properties[MSMQChannelProperties.RetryCounter] = ++intRetryCounter;

                    // open the queue
                    RetryQueue           = new MessageQueue();
                    RetryQueue.Path      = m_RetryQueuePath;
                    RetryQueue.Formatter = new BinaryMessageFormatter();

                    // create message label
                    string label = string.Format("Retry*{0}", msg.Label);

                    // option: disable timeout, now the message has a lifetime forever
                    if (UseTimeout == false)
                    {
                        msg.TimeToBeReceived = Message.InfiniteTimeout;
                    }

                    // send message (move message to the waiting queue, after mqtx.commit of course)
                    RetryQueue.Send(msg, label, mqtx);

                    // echo
                    Trace.WriteLine(string.Format("[{0}]MSMQChannel.Receiver:MessageDispatcher_RETRY done for {1}x", ChannelName, intRetryCounter - 1));

                    // result (retry is in progress)
                    result = true;
                }
            }
            catch (Exception ex)
            {
                Trace.WriteLine(string.Format("[{0}]MSMQChannel.Receiver:MessageDispatcher_RETRY failed, error={1}", ChannelName, ex.Message));
            }
            finally
            {
                if (RetryQueue != null)
                {
                    RetryQueue.Close();
                }
            }

            return(result);
        }
Exemple #2
0
 static void RetryTimer_Elapsed(object sender, ElapsedEventArgs e)
 {
     RetryWatch[] queue;
     lock (RetryQueue) {
         queue = RetryQueue.Values.ToArray();
     }
     queue = queue.Where(rw => DoRetry(rw)).ToArray();
     lock (RetryQueue) {
         foreach (RetryWatch resolved in queue)
         {
             RetryQueue.Remove(resolved.eventArgs);
         }
     }
 }
Exemple #3
0
 static void Retry(FileSystemEventArgs e, FileSystemWatcher sender)
 {
     lock (RetryQueue) {
         if (RetryQueue.ContainsKey(e))
         {
             RetryQueue[e].retries--;
             if (RetryQueue[e].retries <= 0)
             {
                 RetryQueue.Remove(e);
             }
         }
         else
         {
             RetryQueue.Add(e, new RetryWatch(sender, e));
         }
     }
     RetryTimer.Enabled = true;
 }