一个小问题,列表是否能够存储大量消息。
我的代码是这样的,我收到了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);
}
}
这是正确的方法,还是有替代方案?让我知道你的建议和帮助!
答案 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();
}