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); }
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); } } }
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; }