3

メールを追加するメッセージキューがあります。すべてのメールを抽出し、追加された日付と優先度を調べて、そのうちの1つだけを送信したいと思います。私はこのようなメッセージを読みました:

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:私が考えている解決策の1つは、各メッセージにIDを追加し、ReceiveByIdを使用することです。

他のヒントはありますか?

4

1 に答える 1

4

一部のメッセージのみを読み取って削除する方法はありますか?

私はMSMQを使用したことがありません(とにかく怒りはありません)が、PeekReceiveByIdメソッドの両方を組み合わせることができるはずです。

したがって、引き続きPeekキューで使用可能なメッセージを確認し、メッセージを削除することを決定したら、を使用してReceiveById、キューを処理/削除します。

これとは別に、おそらく他のオプションは2つのキューを利用することです。1つ目はすべての受信メッセージ用で、2つ目は保持したいメッセージを追加するために使用されます。

それで、あなたの例に戻ります(私があなたが達成しようとしていることを理解していると仮定して)

  • 1つ目は、説明されているように処理する受信メールの場合、すべてのメールを抽出し、追加された日付と優先度を調べます。
  • 2つ目は、送信メール用です。つまり、送信する電子メールを取得したら、それを送信キューにプッシュします。
于 2012-08-09T12:38:42.280 に答える