以列表形式接收 MSMQ 消息
本文关键字:MSMQ 消息 列表 | 更新日期: 2023-09-27 18:36:41
只是一个小问题,一个列表是否能够存储大量消息。
我的代码是这样的,我正在接收 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();
}