コード例 #1
0
        private void OnTimeoutCallback(object state)
        {
            var haveTimeoutMessages = false;

            timeoutMessageIds.Read(reader => haveTimeoutMessages = reader.HasAnyBefore(CurrentTime));
            if (!haveTimeoutMessages)
            {
                return;
            }
            timeoutMessageIds.Write(writer =>
            {
                KeyValuePair <DateTime, List <string> > pair;
                while (writer.TryRemoveFirstUntil(CurrentTime, out pair))
                {
                    if (pair.Key > CurrentTime)
                    {
                        return;
                    }
                    foreach (string messageId in pair.Value)
                    {
                        Uri queueUri = null;
                        try
                        {
                            using (var queue = parentTransport.CreateQueue())
                                using (var tx = new TransactionScope())
                                {
                                    queueUri = queue.RootUri;
                                    logger.DebugFormat("Moving message {0} to main queue: {1}", messageId, queueUri);
                                    queueStrategy.MoveTimeoutToMainQueue(queue, messageId);
                                    tx.Complete();
                                }
                        }
                        catch (InvalidOperationException)
                        {
                            logger.DebugFormat("Could not move message {0} to main queue: {1}", messageId, queueUri);
                            if ((CurrentTime - pair.Key).TotalMinutes >= 1.0D)
                            {
                                logger.DebugFormat("Tried to send message {0} for over a minute, giving up", messageId);
                                continue;
                            }
                            writer.Add(pair.Key, messageId);
                            logger.DebugFormat("Will retry moving message {0} to main queue {1} in 1 second", messageId, queueUri);
                        }
                        catch (Exception e) { logger.Error("Could not move message " + messageId + " from timeout queue", e); }
                    }
                }
            });
        }