我该如何使用MSMQ?

3

我写了这段代码,它能够正常工作,但是让我开始思考如何使用MSMQ:

我应该使用“using”语句来获取消息队列吗?使用using语句可以在我完成操作后处理掉队列,但我什么时候算完成了呢?我应该保存我的MessageQueue对象以供重复使用。比如说,在一个ASP.Net应用程序中,我想从同一个操作发送3条信息到同一个队列中。是保存对象并重复使用还是像现在这样创建并处理?

using (MessageQueue msgQueue = new MessageQueue(this.queueName))
{
    using (MessageQueueTransaction msgTx = new MessageQueueTransaction())
    {                      
        Message recoverableMessage = null;
        msgTx.Begin();
        try
        {
            recoverableMessage = new Message();
            recoverableMessage.Body = message;
            recoverableMessage.Formatter = new BinaryMessageFormatter(System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple, System.Runtime.Serialization.Formatters.FormatterTypeStyle.TypesAlways);
            recoverableMessage.Recoverable = true;

            msgQueue.Send(recoverableMessage, msgTx);
            ////this.msgQ.Send(recoverableMessage, msgTx); //whats up here??? this will teach me for taking time off. not sure whuc I shuold use
            msgTx.Commit();
            result = recoverableMessage.Id;
            //recoverableMessage.Dispose();
        }
        catch (Exception)
        {
            msgTx.Abort();
            ////recoverableMessage.Dispose();
        }
        finally
        {
            if (recoverableMessage != null)
            {
                recoverableMessage.Dispose();
            }
        }
    }
}
1个回答

5
一般来说,您应该尽可能短地保留对象的生命周期。这是为了防止.NET垃圾回收器将这些对象从0代移动到1代等等。这将有助于减少内存消耗和垃圾回收次数。
话虽如此,保留消息队列对象的唯一原因是要在单个事务或作用域的一部分中发布多个消息到同一个队列。
如果这三条消息在单个页面请求期间发送,则每次呈现页面时创建新的消息队列实例,发送消息并处理队列。
编辑 有关线程安全等详细信息,请参阅文档。 例如,MSDN指出,仅GetAllMessages方法是线程安全的。我会认为API的其余部分都不是线程安全的。但是,这仅意味着不应同时由多个线程访问单个MessageQueue对象实例。您可以创建指向同一队列的多个MessageQueue实例。

关于性能,我认为你可能试图过早地进行优化。我建议对软件进行剖析(仅限发布版本)并将其置于一定负载下。这是您获得可靠答案的唯一方法。


谢谢,我的问题更多是关于MSMQ的。在指定名称的服务器上只有1个队列,所以我想知道是否在维护队列引用方面存在某些优势或劣势。当然,我不明白底层发生了什么。获取队列引用是否更昂贵,还是维护引用更昂贵?如果多个线程获取队列实例并尝试写入队列,是否会出现并发问题? - Noel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接