我应该如何使用 MSMQ

本文关键字:MSMQ 何使用 我应该 | 更新日期: 2023-09-27 18:36:37

我写了这段代码,它正在工作,但它让我开始思考我应该如何使用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();
            }
        }
    }
}

我应该如何使用 MSMQ

通常,应使对象尽可能短地保持活动状态。这是为了防止 .NET 垃圾回收器将这些对象从第 0 代移动到第 1 代,依此类推。这将有助于减少内存消耗和垃圾回收的数量。

话虽如此,保持消息队列对象活动的唯一原因是将多条消息作为单个事务或范围的一部分发布到同一队列。

如果在单个页面请求期间发送了三条消息,则创建消息队列的新实例,发送消息并在每次呈现页面时释放队列。

编辑
有关线程 satefy 等的详细信息,您应该参考文档。
例如,MSDN 表示只有 GetAllMessages 方法是线程安全的。然后,我会假设 API 的其余部分不是线程安全的。但是,这仅意味着多个线程不应同时访问MessageQueue对象的单个实例。您可以创建指向同一队列的多个实例MessageQueue

关于性能,我认为您可能正在尝试过早优化。我建议分析您的软件(仅发布版本)并将其置于一定的负载之下。这是你得到可靠答案的唯一途径。