2012-08-09 123 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