3 Stimmen

Wie sollte ich MSMQ verwenden?

Ich schrieb diesen Code, der funktioniert, aber es machte mich anfangen zu denken, wie sollte ich MSMQ verwenden: Sollte ich eine "using"-Anweisung verwenden, um die Nachrichtenwarteschlange zu erhalten? Die Using-Anweisung sorgt dafür, dass ich die Warteschlange loswerde, wenn ich mit ihr fertig bin, aber wann bin ich mit ihr fertig? Sollte ich mein MessageQueue-Objekt zur Wiederverwendung speichern. Nehmen wir an, es handelt sich um eine ASP.Net-Anwendung und ich möchte 3 Nachrichten aus derselben Aktion an dieselbe Warteschlange senden. Soll ich das Objekt speichern und wiederverwenden oder erstellen und entsorgen, wie ich es gerade tue?

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();
            }
        }
    }
}

5voto

Chris Bednarski Punkte 3052

Im Allgemeinen sollten Sie Objekte so kurz wie möglich am Leben halten. Dies soll verhindern, dass der .NET Garbage Collector diese Objekte von Generation 0 nach Generation 1 verschiebt und so weiter. Dies wird dazu beitragen, den Speicherverbrauch und die Anzahl der Garbage Collections zu reduzieren.

Der einzige Grund, ein Nachrichtenwarteschlangen-Objekt am Leben zu erhalten, wäre, mehrere Nachrichten als Teil einer einzigen Transaktion oder eines Bereichs in dieselbe Warteschlange zu stellen.

Wenn die drei Nachrichten während einer einzigen Seitenanforderung gesendet werden, erstellen Sie eine neue Instanz der Nachrichtenwarteschlange, senden die Nachrichten und entsorgen die Warteschlange jedes Mal, wenn eine Seite gerendert wird.

EDITAR
Einzelheiten zur Fadensättigung usw. entnehmen Sie bitte der Dokumentation.
Zum Beispiel, MSDN sagt, dass nur die GetAllMessages Methode ist thread-sicher. Ich würde dann annehmen, dass der Rest der API nicht thread-sicher ist. Dies bedeutet jedoch nur, dass eine einzelne Instanz von MessageQueue Objekt sollte nicht von mehreren Threads gleichzeitig aufgerufen werden. Sie können mehrere Instanzen von MessageQueue die auf dieselbe Warteschlange verweisen, in Ordnung.

Was die Leistung anbelangt, so denke ich, dass Sie vielleicht zu früh versuchen, zu optimieren. Ich schlage vor, dass Sie ein Profil Ihrer Software erstellen (nur den Release-Build) und sie einer gewissen Belastung aussetzen. Nur so erhalten Sie eine zuverlässige Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X