2012-08-09 128 views
3

我有一个消息队列,我在其中添加一些电子邮件。 我想提取所有电子邮件,检查它们的添加日期和优先级,并只发送其中的一个。 我已读邮件这样的:只处理来自消息队列的一些消息

private IList<Email> GetEmailsFromQueue(MessageQueue queue) 
{ 
    queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(Email) }); 
    IList<Email> emails = new List<Email>(); 
    Cursor cursor = queue.CreateCursor(); 
    Message m = PeekWithoutTimeout(queue, cursor, PeekAction.Current); 
    if (m != null) 
    { 
     emails.Add((Email)m.Body); 
     while ((m = PeekWithoutTimeout(queue, cursor, PeekAction.Next)) != null) 
     { 
      emails.Add((Email)m.Body); 
     } 
    } 
    return emails; 
} 

private Message PeekWithoutTimeout(MessageQueue q, Cursor cursor, PeekAction action) 
{    
    Message msgFromQueue = null; 
    try 
    { 
     msgFromQueue = q.Peek(new TimeSpan(1), cursor, action); 
    } 
    catch(MessageQueueException ex) 
    { 
     if (!ex.Message.ToLower().Contains("timeout")) 
     { 
      throw; 
     } 
    } 
    return msgFromQueue; 
} 

接收方法从队列中删除该消息。 有什么方法可以阅读和删除只有一些消息?

LE:一个解决方案,我威武想到的是一个ID添加到每封邮件,并使用ReceiveById

任何其他提示吗?

+1

也许nservicebus是一个选择? http://www.nservicebus.com/ 这是围绕MSMQ的框架,通过队列发送消息并使用处理程序处理特定的消息。 – Thomas 2012-08-09 11:48:54

+0

你能澄清你为什么要这么做*有什么方法可以阅读和删除只有一些消息?* – 2012-08-09 12:39:07

回答

4

有什么方法可以只读取和删除一些消息吗?

我从来没有使用MSMQ(以及不愤怒反正),但我认为你应该能够同时PeekReceiveById方法结合起来。

因此,您将继续在队列中看到哪些消息可用,然后一旦您决定删除使用ReceiveById的消息来处理/从队列中删除。

除此之外,也许另一种选择是利用2个队列。第一个将用于所有入站消息,第二个将用于添加要保留的消息。

所以回到你的例子(假设我理解你想要达到的)

  • 第一将是描述提取所有的电子邮件,你处理接收的电子邮件,当他们检查的日期加入及其优先
  • 第二将是您的出站电子邮件,即,一旦你有你要发送的邮件,将其推到出站队列
+1

感谢您的回复。有用。 – gigi 2012-08-09 19:11:59