簡體   English   中英

僅處理來自消息隊列的一些消息

[英]Process only some messages from a message queue

我有一個消息隊列,我在其中添加一些電子郵件。 我想提取所有電子郵件,檢查添加日期和優先級,並只發送其中一個。 我讀過這樣的消息:

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

Receive方法將從隊列中刪除該消息。 有沒有辦法只讀取和刪除一些消息?

LE:我想到的一個解決方案是為每條消息添加一個id,並使用ReceiveById

還有其他提示嗎?

有沒有辦法只讀取和刪除一些消息?

我從來沒有使用過MSMQ(反正不是很憤怒)但我認為你應該能夠結合PeekReceiveById方法。

所以,你會繼續Peek在隊列,看看有什么消息可用,然后,一旦你已經決定刪除郵件利用的ReceiveById ,處理/從隊列中刪除。

除此之外,另一種選擇可能是使用2個隊列。 第一個用於所有入站消息,第二個用於添加要保留的消息。

所以回到你的例子(假設我明白你想要實現的目標)

  • 第一個是您按照描述處理的入站電子郵件, 提取所有電子郵件,檢查添加日期和優先級
  • 第二個是您的出站電子郵件,即一旦您有要發送的電子郵件,請將其推送到出站隊列

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM