以列表形式接收 MSMQ 消息

  • 本文关键字:MSMQ 消息 列表 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);
    }
}

这是正确的方法,还是有其他选择?让我知道您的建议和帮助!

似乎一切都很好...它通常提供了多种方法来编程完全相同的东西,但你的方法已经很好了;)

我个人宁愿使用 for 循环,但我知道的联盟不是那么高的 msmq,所以......

下一个级别是编程键盘记录器旁路注入或如何调用它......(我希望我没有误解你对这段代码的意图)。

首先,当你在执行 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();
}

最新更新