簡體   English   中英

接收MSMQ消息作為列表

[英]Receiving MSMQ messages as a list

只是一個小問題,即列表是否能夠存儲大量消息。

我的代碼是這樣的,我正在接收並分配給消息列表的隊列消息有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並不是很高,所以...

下一步是對Keylogger-Bypass-injection或它的調用方式進行編程...(我希望我不會因為這段代碼而誤解了您的意圖)。

首先,在執行RecieveById時,您將從隊列中刪除該消息。 而且,如果您的軟件在從隊列中讀取所有消息后崩潰,那么它們將永遠消失。

您應該使用BeginPeek並創建事件處理程序OnPeekCompleted來處理來自隊列的新消息。 這樣,您一次只處理一條消息,而在閱讀所有內容然后進行處理時就不會受到此類錯誤的影響。

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

暫無
暫無

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

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