[英]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.