以列表形式接收MSMQ消息

时间:2013-10-23 07:06:07

标签: c# msmq

一个小问题,列表是否能够存储大量消息。

我的代码是这样的,我收到了50,000条队列消息并分配给消息列表。

var msgEnumerator = msgQueue.GetMessageEnumerator2();
var messages = new List<System.Messaging.Message>();
while(msgEnumerator.MoveNext(new TimeSpan(0, 0, 1))) {
    var msg = msgQueue.ReceiveById(msgEnumerator.Current.Id, new TimeSpan(0, 0, 1));
    messages.Add(msg);
 }

foreach(var k in messages) {
    MailMessage mailM = (k.Body as SerializeableMailMessage).GetMailMessage();

    try {
        SmtpClient sp = new SmtpClient(smtpip, 25);
        sp.EnableSsl = false;
        sp.Send(mailM);
    }   
    catch (Exception ex) {
        logger.ErrorException("General error sending email.", ex);
    }
}

这是正确的方法,还是有替代方案?让我知道你的建议和帮助!

2 个答案:

答案 0 :(得分:1)

好像都好...... 它通常有多种方式来编程完全相同的东西,但是你的已经非常好了;)

我个人更愿意使用for循环,但我知道联盟不是那么高的msmq,soooo ......

下一级是编写键盘记录 - 旁路注入或如何调用...(我希望我没有用这段代码理解你的意图)。

答案 1 :(得分:0)

首先,当您执行RecieveById时,您将从队列中删除该消息。如果您的软件在读取队列中的所有消息后崩溃,它们将永远消失。

您应该使用BeginPeek并创建事件处理程序OnPeekCompleted来处理来自队列的新消息。这样,您一次只处理1条消息,并且在阅读所有消息然后处理它们时不易受此类错误的影响。

private static void Main()
{
    var queue = new MessageQueue("myQueue");
    queue.PeekCompleted += new PeekCompletedEventHandler(OnPeekCompleted);

    // Start listening to queue
    queue.BeginPeek();
}

private void OnPeekCompleted(object sender, PeekCompletedEventArgs e)
{
    var cmq = (MessageQueue)sender;
    try
    {
        var msmqMessage = cmq.EndPeek(e.AsyncResult);

        msmqMessage.Formatter = new XmlMessageFormatter(typeof(messagetypehere));

        var message = msmqMessage.Body;

        // Do logic for the message
        {
            // Send mail or what ever

        }

        cmq.Receive(); // Remove the message from the queue
    }
    catch (Exception ex) 
    {
        // Log or other
    }

    // Refresh queue
    cmq.Refresh();

    // Start listening to queue
    cmq.BeginPeek();
}