我有一个网站,在远程服务器上使用MSMQ来排队待处理的电子邮件.我能够将消息写入队列,然后在队列上调用dispose.队列仍然获取消息,但稍后GC出现并尝试清理它会导致IIS崩溃.这是我在事件日志中看到的:
例外:
System.NullReferenceException消息:对象引用未设置为对象的实例.
堆栈跟踪:
at System.Messaging.Cursor.Finalize()
这段代码运行良好多年,但最近才开始表现.我已重新启动所有服务器以对其进行故障排除,但这没有用.
编辑1
这是发送消息的代码.QueueFactory只是一个单独的锁定创建一个MessageQueue.
using (System.Messaging.MessageQueue queue
= QueueFactory.Instance.BuildQueue(this.Path))
{
System.Messaging.Message message = new System.Messaging.Message
{
Body = body,
Formatter = new BinaryMessageFormatter(),
TimeToBeReceived = this.ExpirationMinutes
};
queue.Send(message, label);
}
Run Code Online (Sandbox Code Playgroud)
try-catch这个代码周围有一个,我知道它永远不会进入这个代码catch块.我开始认为这是整个应用程序从.NET 3.5升级到.NET 4.0时引起的.然而,它偶尔会开始发生,但现在每次我向队列写一条消息时都会发生这种情况.
编辑2
这是代码 BuildQueue
lock (lockHandler)
{
return new System.Messaging.MessageQueue(queuePath);
}
Run Code Online (Sandbox Code Playgroud)
尝试使用事务:
using (System.Messaging.MessageQueue queue
= QueueFactory.Instance.BuildQueue(this.Path))
{
System.Messaging.Message message = new System.Messaging.Message
{
Body = body,
Formatter = new BinaryMessageFormatter(),
TimeToBeReceived = this.ExpirationMinutes
};
MessageQueueTransaction transaction = new MessageQueueTransaction();
try
{
transaction.Begin();
queue.Send(message, label, transaction);
transaction.Commit();
}
catch(System.Exception e)
{
transaction.Abort();
throw e;
}
finally
{
transaction.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)