Wie lange lässt sich MSMQ noch nutzen? ── Die Migrationsentscheidung für eine Legacy-Queue, die nicht einmal „deprecated“ ist
· Go Komura · Windows, .NET, C#, MSMQ, Nachrichtenwarteschlange, Legacy-Technologie, Migration, Informationssysteme
Änderungsverlauf (Erstfassung, veröffentlicht am 29. Jul 2026)
- Erstveröffentlichung
Diesen Artikel zitieren(DOI (registriertes Archiv): 10.5281/zenodo.22175278)
Die folgenden DOIs verweisen auf bereits archivierte Versionen, die vom aktuellen Text abweichen können. Verwenden Sie die URL dieser Seite, um auf den aktuellen Text zu verweisen.
Go Komura (2026). Wie lange lässt sich MSMQ noch nutzen? ── Die Migrationsentscheidung für eine Legacy-Queue, die nicht einmal „deprecated“ ist. KomuraSoft LLC. https://comcomponent.com/de/blog/msmq-migration-decision-guide/
- DOI (registriertes Archiv)
- 10.5281/zenodo.22175278
- DOI (zuletzt registrierte Version)
- 10.5281/zenodo.22175279
„Ich habe gehört, MSMQ sei eingestellt worden. Muss das System, das wir heute betreiben, sofort migriert werden?“ — wenn Sie ein bestehendes System warten, ist das das Erste, das auseinandergezogen werden muss.
Ob MSMQ (Microsoft Message Queuing) als Betriebssystemfunktion fortbesteht und ob es eine API gibt, um es aus .NET zu nutzen, sind zwei getrennte Fragen. Stand Juli 2026, dem Bezugspunkt dieses Artikels, taucht MSMQ auf den offiziellen Listen deprecated Features nicht auf und bleibt ein optionales Windows-Feature. Die Standardbibliothek System.Messaging dagegen ist ausschließlich für das .NET Framework und wurde nie auf .NET (Core und später) portiert.123
Das Problem ist also nicht, dass MSMQ morgen aufhört zu funktionieren. Es ist, dass die Queue-Implementierung zum Hindernis wird, wenn Sie die Anwendung auf .NET heben.
Dieser Artikel richtet sich an die Entwickler, die Systeme mit MSMQ warten und migrieren, und an die Abteilungen für Informationssysteme, die die Linie festlegen. Er beginnt damit, die Fakten und die Bedingungen für die Weiternutzung festzuhalten, und arbeitet sich dann durch die Bestandsaufnahme, die Wahl des Migrationsziels, die Implementierung einer Tabellen-Queue und das Umschaltverfahren.
Zur Migration von VB6 oder vom .NET Framework insgesamt siehe „Wie lange laufen VB6-Anwendungen noch? — Support-Status der Laufzeitumgebung und ein praxisnaher Weg zur .NET-Migration“ und „Checkliste vor der Migration von .NET Framework zu .NET“. Dieser Artikel konzentriert sich auf die Queue.
1. Zuerst das Fazit: Das Fortbestehen des Betriebssystems von der Migration der Anwendung trennen
Wenn Sie die Anwendung auf .NET heben, gilt als Grundsatz, die Queue mit zu migrieren. Wenn Sie vorerst auf dem .NET Framework weiterlaufen, können Sie sich für die Weiternutzung von MSMQ entscheiden, sobald Sie den Supportzeitraum des Betriebssystems und die Betriebsbedingungen geprüft haben. MSMQ in einem neuen Projekt einzuführen ist nicht empfehlenswert.4
Lesen Sie von dem aus, was Sie jetzt entscheiden müssen
| Was Sie jetzt entscheiden müssen | Wo die Entscheidung beginnt | Wo es behandelt wird |
|---|---|---|
| Stimmt die Geschichte „es ist eingestellt worden“ | Den Stand der Betriebssystemfunktion vom Stand der Managed API trennen | Kapitel 1: Die Fakten |
| Können wir es vorerst unverändert weiter nutzen | Den Supportzeitraum des Betriebssystems prüfen und ob Überwachung, Wiederherstellung und Übergabe eingerichtet werden können | Kapitel 2: Bedingungen für die Weiternutzung |
| Wir wollen es zusammen mit der .NET-Migration ersetzen | Abhängigkeiten, Formate, DTC und Offline-Toleranz inventarisieren | Kapitel 3: Bestandsaufnahme, Kapitel 4: Migrationsziele |
| Können wir es mit P/Invoke oder CoreWCF am Leben halten | Aufrufbarkeit von der Übernahme der Wartungslast trennen | Abschnitt 1.3: Die Managed API und P/Invoke, Abschnitt 1.4: CoreWCF |
| RabbitMQ oder Azure Service Bus | Vor dieser Wahl prüfen, ob eine Tabellen-Queue in derselben Geschäftsdatenbank ausreicht | Kapitel 4: Nach Anforderung wählen, Kapitel 5: Die Tabellen-Queue |
| Wir wollen das Entnahme-SQL in unsere eigene Datenbank übernehmen | Isolationsstufe, Snapshot-Einstellung und Sperrhinweise prüfen | Abschnitt 5.3: SQL und Datenbankeinstellungen |
| Wir müssen die Verarbeitungsreihenfolge der Queue wahren | Die Entnahmereihenfolge von der Reihenfolge trennen, in der Geschäftsdaten aktualisiert werden | Abschnitt 5.4: Parallelität und Reihenfolge |
| Wir wollen den Worker in den Produktivbetrieb bringen | Die Transaktionsgrenze sowie Rückholung, Wiederholung und Aufräumen prüfen | Abschnitt 5.5: Der Worker, Abschnitt 5.6: Betrieb |
| Wie schalten wir ein laufendes System um | Nachrichtenformat, Empfängerseite, Duplikatbehandlung und den Verbleib restlicher Nachrichten festlegen | Kapitel 6: Umschaltverfahren |
Wenn Sie den Artikel durchlesen, ist die Reihenfolge bestätigen, was fortbesteht → Bedingungen für die Weiternutzung → Bestandsaufnahme → Migrationsziel → Implementierung → Umschaltung. Wenn Sie die Entscheidung später erneut ansehen, siehe die Zusammenfassung in Kapitel 7.
1.1. Bestätigen, um welche Schicht es in der Frage geht
Die Antwort auf „kann MSMQ noch genutzt werden“ unterscheidet sich je nach Schicht wie folgt. Bezugspunkt für diese Zustände ist Juli 2026, derselbe wie am Anfang des Artikels.
| Schicht | Aktueller Stand | Was das in der Praxis bedeutet |
|---|---|---|
| Betriebssystemfunktion (ein optionales Windows-Feature) | Am Leben. Es wird mit aktuellen Windows-Client- und Windows-Server-Versionen ausgeliefert, und es ist keine Deprecation erklärt worden12 | Aktivieren Sie es, und es läuft weiter. Sie können es nutzen, solange das Betriebssystem unterstützt wird |
Native Win32-API (MQSendMessage und vergleichbare) |
Dokumentiert und verfügbar5 | Der Weg, sie aus .NET per P/Invoke aufzurufen, bleibt offen. Aber Sie enden dabei, Formatter und Transaktionsanbindung selbst zu schreiben und zu pflegen |
| System.Messaging im .NET Framework | Verfügbar, aber nur für .NET Framework 1.1 bis 4.8.13 | Hier laufen bestehende Systeme. Darüber hinaus gibt es nichts |
| Die offizielle Managed API auf .NET (Core und später) | Existiert nicht. Sie ist auch nicht im Windows Compatibility Pack6 | In dem Moment, in dem Sie die Anwendung auf .NET heben, muss der Queue-Teil neu gebaut werden |
| MSMQ-Binding von WCF → CoreWCF.MSMQ | Eine community-geführte Portierung existiert. CoreWCF selbst hat eine Support-Richtlinie, aber die MSMQ-Implementierung hängt von einer Community-Portierung von System.Messaging ab7 | Nutzbar, um das Leben eines über eine Queue aufgerufenen WCF-Dienstes (der Empfängerseite) zu verlängern, aber weder ein Ersatz für die Senderseite noch eine allgemeine Queue-API |
| Neue Einführung | Nicht empfohlen | Weil es keinen offiziellen Weg nach vorn gibt |
1.2. Was nicht deprecated ist, ist die Betriebssystemfunktion
Die Liste „Deprecated features“ des Windows-Clients trägt Einträge wie NTLM, VBScript und WordPad, aber es gibt keinen Eintrag für MSMQ. Dasselbe gilt für „Features Removed or No Longer Developed“ von Windows Server, einschließlich der Registerkarte Windows Server 2025.12
Deprecated ist eine offizielle Stufe, die anzeigt, dass die aktive Entwicklung beendet ist und das Feature in einem künftigen Update entfernt werden kann. Sie ist von removed zu unterscheiden. Für MSMQ hat dieser Artikel bestätigt, dass nicht einmal diese Deprecation erklärt worden ist.
1.3. Was die Migration zu .NET blockiert, ist die Managed API
Die Referenz von System.Messaging.MessageQueue deckt .NET Framework 1.1 bis 4.8.1 ab; es gibt keine Ausgabe für .NET (Core und später). Das Windows Compatibility Pack (Microsoft.Windows.Compatibility) liefert rund 20.000 APIs und deckt Bereiche wie die Registry, WMI, Windows-Dienste und EventLog ab, enthält aber nicht System.Messaging.36
Wenn Sie es mit P/Invoke am Leben halten, übernehmen Sie die Pflege des Wrappers
Auch die native API ist nicht verschwunden. Win32-APIs wie MQSendMessage und MQReceiveMessage aus .NET per P/Invoke aufzurufen, ist an sich möglich. Aber Sie werden einen eigenen Wrapper für die Formatter und die Transaktionsanbindung schreiben und pflegen, die System.Messaging geliefert hat. Das ist nicht der Hauptweg einer Migration; es ist ein Mittel, MSMQ zu verlängern, wenn Sie es unbedingt behalten müssen.5
1.4. CoreWCF als Weg für die WCF-Empfängerseite beurteilen
WCF im .NET Framework hatte ein Binding, das MSMQ verwendet. Als Weg, das auf .NET zu hosten, gibt es den MSMQ-Transport von CoreWCF (CoreWCF.MSMQ).7
Sein Zweck ist allerdings die Empfängerseite eines über eine Queue aufgerufenen WCF-Dienstes. Es ist weder eine allgemeine Queue-API, die System.Messaging ersetzt, noch ein Ersatz für den sendenden Client.
CoreWCF selbst hat eine Microsoft-Support-Richtlinie. Die Implementierung des MSMQ-Transports hängt jedoch von einer Community-Portierung der .NET-Framework-Version von System.Messaging ab, und diese Abhängigkeit kann nicht so behandelt werden, als trüge sie dieselbe Garantie. Übernehmen Sie es erst, nachdem Sie geprüft haben, ob die von Ihnen genutzte Version unter den Support fällt und wer den abhängigen Teil pflegt.7
„MSMQ ist bereits eingestellt“ und „es lässt sich nicht unverändert nach .NET heben“ bedeuten also nicht dasselbe. P/Invoke oder CoreWCF zu wählen, schiebt das Ersetzen der Queue hinaus, zum Preis, die Wartungslast dieses Weges zu übernehmen.
In der Abbildung kennzeichnet eine durchgezogene Linie eine stets geltende Beziehung und eine gestrichelte Linie eine bedingte (die Bedingungen stehen bei jeder Beziehung auf der Detailseite). Die vollständige Liste der Beziehungen (28 insgesamt, mit Beleg und Sicherheitsgrad) und die Definitionen der wichtigsten Konzepte sind auf der Detailseite der Wissenskarte (auf Japanisch) zusammengestellt. Daten: JSON-LD / Turtle
2. Ob Sie es weiter nutzen: Anhand des .NET-Migrationsplans und Ihrer Betriebsorganisation entscheiden
2.1. Warum „es läuft“ nicht ausreicht, um zu entscheiden
.NET Framework 4.8 wird als Windows-Komponente entlang des Lebenszyklus des Betriebssystems unterstützt, auf dem es installiert ist. Sie können daher planen, es innerhalb dieses Supportzeitraums weiterlaufen zu lassen.4
Was Sie feststellen wollen, ist nicht nur, ob es läuft. Wenn eine Abhängigkeit von MSMQ die ganze Anwendung auf dem .NET Framework hält, bleiben auch die folgenden Wartungs- und Migrationslasten.
| Last | Wirkung auf die Migrationsentscheidung |
|---|---|
| Maintainer sichern und das System übergeben | Immer weniger Ingenieure können System.Messaging und DTC erklären, daher steigt der Aufwand, die Konfiguration von Grund auf zu untersuchen |
| Laufzeit- und Bibliotheksbeschränkungen | Manche neue C#-Syntax ist mit nichts weiter als einem Compiler-Update verfügbar, aber Laufzeit-Leistungsverbesserungen und neue Standardbibliotheken bleiben unerreichbar. Immer mehr Pakete streichen .NET Framework als Ziel |
| Abhängigkeit von DTC | Wenn Sie den Teil belassen, der „Entnahme aus der Queue“ und „Aktualisierung der Datenbank“ gemeinsam festschreibt, modernisieren Sie nur die Peripherie und das härteste Problem bleibt bis zuletzt |
| Alte Serialisierungsformate | Die Implementierung von BinaryFormatter wurde in .NET 9 aus der Laufzeit entfernt, daher muss die Migration auch das Format erfassen8 |
Das Problem, den Maintainer zu verlieren, wird auch in „Wenn Sie ein System ohne Quellcode und ohne Dokumentation übernehmen — Ein praktisches Playbook, um es am Laufen zu halten“ behandelt. MSMQ-Anfragen beginnen eher mit einer Migrationsschätzung als mit einem Ausfall, gerade weil das, was Schwierigkeiten macht, diese Art von Abhängigkeit und Übergabe ist, nicht das Verhalten selbst.
„Es läuft, solange das Betriebssystem es unterstützt“ und „je länger Sie warten, desto leichter wird die Migration“ sind zwei verschiedene Behauptungen. Auch wenn Sie vorerst nicht migrieren, nehmen Sie die schwierigen Teile zuerst auf.
2.2. Wenn Sie vorerst nicht migrieren, erfüllen Sie vier Mindestbedingungen
Keinen Plan zu haben, die Anwendung auf .NET zu heben, und sie vorerst aus Kosten-Nutzen-Gründen unverändert zu lassen — oft als Belassen im Ist-Zustand bezeichnet — ist unter Bedingungen vernünftig. Die Voraussetzung ist allerdings, dass alle vier der folgenden Punkte erfüllt sind.
| Prüfung | Mindestbedingung | Was Sie konkret tun | Was passiert, wenn Sie es nicht tun |
|---|---|---|---|
| □ | MSMQ ausdrücklich in den Kitting- und Wiederherstellungsverfahren festhalten | MSMQ ist ein optionales Windows-Feature. Schreiben Sie die Schritte zur Aktivierung über Windows-Features aktivieren oder deaktivieren oder über DISM oder PowerShell in das Handbuch zum Umgebungsaufbau | Jemand vergisst die Aktivierung beim Austausch eines PCs oder Servers, und am Umschalttag funktioniert ohne erkennbaren Grund nichts |
| □ | Die Queue-Länge überwachen | Legen Sie Schwellwertüberwachung und Benachrichtigung auf die Rückstandszahl. Beziehen Sie die Dead-Letter-Queue und die Journal-Queue mit ein | Wenn die Empfängerseite stoppt, hebt nichts einen Fehler und Nachrichten stapeln sich einfach, sodass der Betrieb stillsteht, ohne dass es jemand merkt |
| □ | Die Konfiguration dokumentieren | Halten Sie die Queue-Pfade, die Berechtigungen, ob Transaktionen genutzt werden, den Formatter und die Journal-Einstellungen fest (die Inventartabelle in Abschnitt 3.2 kann unverändert verwendet werden) | Eine künftige Migrationsschätzung muss von der Untersuchung neu beginnen, und sowohl ihre Genauigkeit als auch ihr Aufwand leiden |
| □ | Die Entscheidung einmal im Jahr überprüfen | Prüfen Sie jährlich, ob es auf einer Deprecated-Liste erschienen ist und ob ein Betriebssystemupdate das Verhalten geändert hat | Sie geraten erst in Hektik, nachdem die Deprecation-Mitteilung veröffentlicht ist |
Gerade die jährliche Überprüfung ist das Verfahren, das verhindert, dass Ihnen eine Deprecation-Mitteilung oder die Wirkung eines Betriebssystemupdates entgeht. Falls die verantwortliche Person wechselt, hinterlassen Sie nicht nur die Konfiguration, sondern auch das Wiederherstellungsverfahren. Den Status quo ohne diese Bedingungen zu halten, trägt das Risiko, dass niemand mehr weiß, weder dass es gestoppt hat, noch warum.
3. Bestandsaufnahme: Festhalten, was Sie MSMQ übertragen haben
3.1. Die Funktionen und die Terminologie klären
Bei MSMQ schreibt der Sender eine Nachricht in eine Queue, und eine Anwendung auf derselben Maschine oder auf einer anderen entnimmt sie, wann es ihr passt. Es gibt vor allem drei Eigenschaften, die auf das Migrationsziel übergehen müssen.
Es sammelt sich auch, wenn das Ziel down ist: Store-and-Forward
Auch wenn das Ziel down ist, sammeln sich Nachrichten lokal und werden zugestellt, sobald es sich erholt. Das hilft auf instabilen Standort-zu-Standort-Verbindungen, garantiert aber nicht bedingungslos Dauerhaftigkeit über einen Neustart hinweg.
Es schreibt Queue und Datenbankaktualisierung gemeinsam fest: Transaktionen
Queue-Operationen können transaktional gemacht werden, und mit MS DTC (dem Distributed Transaction Coordinator) können die Entnahme aus der Queue und die Datenbankaktualisierung in einer einzigen verteilten Transaktion festgeschrieben werden.
Es war ohne zusätzliche Middleware nutzbar: Mit dem Betriebssystem ausgeliefert
Weil keine zusätzliche Middleware installiert werden musste, wurde es in den 2000er-Jahren breit für die Auftragsanbindung, die asynchrone Berichtserzeugung und die Anbindung zwischen Fertigungsschritten in der Halle genutzt. Die Kombination dieser drei Eigenschaften ist der Grund, warum es noch da ist.
Ansammlung, Dauerhaftigkeit und Transaktionen namentlich unterscheiden
Die in den Entscheidungstabellen verwendeten Begriffe werden hier ebenfalls festgelegt.9
| Begriff | Was er bedeutet und warum Sie ihn prüfen |
|---|---|
| Private Queue / öffentliche Queue | Eine private Queue wird nur auf dem lokalen Computer registriert und nicht in Active Directory veröffentlicht. Sie wird in einer Form wie .\private$\QueueName adressiert. Eine öffentliche Queue wird im Verzeichnis registriert und kann in der Domäne gefunden werden. In kleinen und mittleren Fachanwendungen sind private Queues der häufige Fall |
| Express-Nachricht | Der Standard-Sendemodus. Sie wird sowohl unterwegs als auch nach der Zustellung im Speicher gehalten, daher ist sie schnell, geht aber verloren, wenn dieser Computer oder der Message-Queuing-Dienst stoppt |
| Recoverable (wiederherstellbare) Nachricht | Wird auf dem sendenden Computer, auf jedem vermittelnden Computer und an der Zielqueue auf der Festplatte gehalten, übersteht also einen Neustart. Der Sender gibt das ausdrücklich an |
| Transaktions-Queue | Verarbeitet ausschließlich transaktionale Nachrichten. Das Attribut wird bei der Erstellung der Queue festgelegt und kann danach nicht geändert werden. Transaktionale Nachrichten werden auf die Festplatte persistiert |
| DTC | Der Windows-Dienst, der eine Transaktion koordiniert, die sich über mehrere Ressourcen erstreckt, etwa MSMQ und eine Datenbank. Wie die Konsistenz zwischen Queue und Datenbank ersetzt wird, ist der Kern der Migration |
| Journal-Queue / Dead-Letter-Queue | Systemqueues, die MSMQ erzeugt. Die erste hält Kopien gesendeter und entnommener Nachrichten, die zweite hält Nachrichten, die nicht zugestellt werden konnten. Überwachen Sie das Kapazitätswachstum, das entsteht, wenn man sie unbeachtet lässt |
„Es kann sich ansammeln, während der Empfänger down ist“ und „es übersteht einen Neustart von MSMQ oder der Maschine“ sind verschiedene Eigenschaften. Untersuchen Sie getrennt, ob Sie sich nur auf die erste stützen oder ob Sie über recoverable oder transaktionale Nachrichten auch die zweite brauchen.
3.2. Die Abhängigkeiten aus Code, Konfiguration und Betrieb ziehen
Die Bestandsaufnahme nicht bei Bibliotheksverweisen enden lassen
Suchen Sie zuerst nach Verweisen auf System.Messaging und nach den Stellen, an denen MessageQueue konstruiert wird. Das Fehlen eines solchen Verweises ist jedoch für sich kein Grund, zu schließen, dass MSMQ nicht genutzt wird. Prüfen Sie die Aufrufwege getrennt.
| Aufrufweg | Wonach Sie in Code und Konfiguration suchen |
|---|---|
| .NET-Framework-Bibliothek | Verweise auf System.Messaging, die Stellen, an denen MessageQueue konstruiert wird |
| WCF-Konfiguration | netMsmqBinding / msmqIntegrationBinding |
| Native API und COM | Native MQ*-Funktionen wie MQSendMessage und Aufrufe über COM |
Pro Queue die Grundlage der Migrationsentscheidung festhalten
Nutzen Sie die folgende Tabelle, um festzuhalten, was Sie finden, eine Zeile pro Queue. Der Punkt ist nicht, abzuhaken und fertig zu sein, sondern die Ergebnisse als Grundlage für die Migrationslinie und für interne Genehmigungsunterlagen hinterlassen.
| Aspekt | Wo Sie hinsehen | Was Sie festhalten | Wie es auf die Entscheidung wirkt |
|---|---|---|---|
| (a) Queue-Pfad | Die an MessageQueue übergebene Pfadzeichenfolge, das Verbindungsziel in Konfigurationsdateien, FormatName:-Angaben |
Lokal oder remote, privat oder öffentlich, der Name der Gegenstelle | Wenn es remote oder standortübergreifend ist, entscheiden Sie, ob Store-and-Forward erforderlich ist (die Zeile „Offline-Toleranz“ in Abschnitt 4.2). Wenn es vollständig lokal ist, fällt es in die erste Zeile von Abschnitt 4.2 |
| (b) Transaktionen und Recoverable | Wo die Queue erstellt wird (ist es eine Transaktions-Queue), ob Recoverable beim Senden angegeben wird, ob DTC genutzt wird | Transaktions-Queue oder nicht, ob Recoverable angegeben ist, ob DTC teilnimmt | Wenn DTC genutzt wird, ist eine Tabellen-Queue als Migrationsziel nahezu fest. Wenn keines von beiden genutzt wird, halten Sie ausdrücklich fest, dass das aktuelle System unter der Voraussetzung betrieben wird, dass Nachrichten beim Neustart verloren gehen |
| (c) Formatter | Wo XmlMessageFormatter / BinaryMessageFormatter / ActiveXMessageFormatter angegeben werden |
Der verwendete Formatter und der Typ des Nachrichtenkörpers | Wenn er auf BinaryFormatter basiert, ist der Ersatz durch JSON zwingend (Abschnitt 6.1). Das wird zum Haupttreiber des Migrationsaufwands8 |
| (d) Journal- und Dead-Letter-Queues | Die Queue-Eigenschaften (ist das Journal aktiviert), der Inhalt der Systemqueues, das Betriebshandbuch | Ob das Journal genutzt wird, ob jemand die Dead-Letter-Queue tatsächlich ansieht | Wie fehlgeschlagene Nachrichten behandelt werden, wird zur Entwurfsanforderung für das Migrationsziel (eine Abstelltabelle im Fall einer Tabellen-Queue) |
| (e) Wer sie erstellt und löscht | Der Installer, die Bereitstellungsskripte, der Create-Aufruf beim Start der Anwendung |
Wer sie erstellt und wer die Berechtigungen konfiguriert | Zur Migrationszeit wird das direkt zu „wer stellt die neuen Queues bereit“. Wenn Sie sich für das Belassen im Ist-Zustand entscheiden, übertragen Sie es in das Kitting-Verfahren (Kapitel 2) |
4. Migrationsziele: Nach den Eigenschaften wählen, die Sie brauchen, nicht nach einem Nachfolgeproduktnamen
4.1. Die Anforderungen mit vier Fragen sortieren
Aus den Ergebnissen der Bestandsaufnahme halten Sie die folgenden vier Punkte fest.
- Ist die Empfängerseite ein Prozess, der Ihre eigene Geschäftsdatenbank aktualisiert?
- Werden die Transaktions-Queue und die Datenbankaktualisierung über DTC gemeinsam festgeschrieben?
- Sind Sender und Empfänger auf verschiedenen Maschinen oder an verschiedenen Standorten? Wird Store-and-Forward tatsächlich genutzt?
- Wie groß ist das Nachrichtenaufkommen? Im Maßstab von einigen Tausend bis einigen Zehntausend am Tag, der für viele Fachanwendungen typisch ist, wird allein der Durchsatz der Kandidaten die Wahl kaum entscheiden.
4.2. Die erste Wahl für jede Eigenschaft
Für einen asynchronen Auftrag, der die Geschäftsdatenbank desselben Systems aktualisiert, sehen Sie zuerst eine Tabellen-Queue an. Wählen Sie einen Broker, wenn es eine Anforderung gibt, die eine Tabellen-Queue nicht erfüllen kann, etwa Zustellung an mehrere Systeme oder Routing.
| Genutzte Eigenschaft | Erste Wahl | Begründung und Vorsicht |
|---|---|---|
| Asynchrone Verarbeitung innerhalb eines Systems (der Empfänger aktualisiert die Datenbank) | Eine Tabellen-Queue in der Datenbank | „Die Nachricht entnehmen“ und „die Geschäftsdaten aktualisieren“ können in derselben lokalen Transaktion festgeschrieben werden, daher wird DTC nicht mehr gebraucht. Die bestehende Sicherung, Überwachung und der Betrieb gelten unverändert. Auch auf der Senderseite können „die Geschäftsdaten aktualisieren und die Nachrichtenzeile einfügen“ in eine Transaktion, das ist das sogenannte Outbox-Muster |
| DTC macht Queue und Datenbankaktualisierung atomar | Eine Tabellen-Queue in der Datenbank | Die verteilte Transaktion durch eine lokale Transaktion zu ersetzen ist der Kern dieser Migration. Cloud-Queue-Dienste können nicht an DTC teilnehmen, daher ist ein Broker ein Umweg, solange diese Anforderung besteht |
| Lose gekoppelte Integration über mehrere Systeme und mehrere Sprachen | RabbitMQ (On-Premises) / Azure Service Bus (kann in der Cloud leben) | Fan-out-Zustellung und Routing sind das, worin Broker gut sind. Bei RabbitMQ kalkulieren Sie die Last, es selbst zu betreiben (Redundanz und Updates) |
| Offline-Toleranz zwischen Standorten (Store-and-Forward) | Azure Service Bus oder vergleichbares plus ein Neuversand-Entwurf, oder eine Tabellen-Queue an jedem Standort plus Synchronisation | Es gibt wenige Mechanismen, die MSMQs „lokal beim Sender halten und später zustellen“ transparent ersetzen. Ändern Sie den Entwurf so, dass die Verantwortung, Nachrichten auf der Senderseite zu halten, ausdrücklich der Anwendung gegeben wird |
| Produzent und Konsument innerhalb eines Prozesses | Eine In-Memory-Queue wie .NET Channels | Ein Fall, in dem eine Interprozess-Queue von vornherein nicht nötig war. Halten Sie es im Prozess und wechseln Sie zu einer Tabellen-Queue, wenn Dauerhaftigkeit erforderlich ist |
| Nur als Interprozesskommunikation zwischen Windows-Diensten genutzt | IPC wie Named Pipes | Aber dieser Ersatz gilt nur, wenn beide Seiten immer gleichzeitig laufen. MSMQ nimmt einen Versand entgegen, während der Empfänger gestoppt ist (auch bei Express-Nachrichten), und stellt später zu, während eine Pipe sofort fehlschlägt. Wenn Sie sich auf Ansammlung stützen, während der Empfänger down ist, implementieren Sie Neuversand und Pufferung in der Anwendung oder behalten Sie eine Queue. Zur Wahl siehe „Windows-Prozesskommunikation richtig wählen ── Eine Entscheidungstabelle für Named Pipes / TCP / gRPC / Shared Memory / COM“ |
Warum eine Tabellen-Queue zuerst kommt
„Sehen Sie zuerst eine Tabellen-Queue an“ ist hier nicht der Wunsch, eine Datenbank für jeden Zweck zu empfehlen. Es ist, dass für die asynchrone Verarbeitung, die dieselbe Datenbank aktualisiert, die in Fachanwendungen der MSMQ-Generation häufig ist, die Konsistenz einfach bleibt und die bestehende Sicherung, Überwachung und der Betrieb genutzt werden können.
Anforderungen, zu denen ein Broker passt, und was Sie zusätzlich entwerfen müssen
RabbitMQ und Azure Service Bus passen zu lose gekoppelter Zustellung über mehrere Systeme und mehrere Sprachen, zu Fan-out und Routing. Sie sind auch erwägenswert, wenn hoher Durchsatz erforderlich ist. Weil Queue und Geschäftsdatenbank getrennte Ressourcen werden, tragen Sie die Atomarität von MSMQ plus DTC jedoch nicht unverändert weiter: Entwerfen Sie Idempotenz und Neuversand in der Anwendung. Nehmen Sie Überwachung, Redundanz, Patches und Schulung für die neue Middleware in die Schätzung auf.
Migrieren heißt nicht immer, dass die Ansammlung während des Stopps entfallen darf
Prüfen Sie, ob Offline-Toleranz und Ansammlung, während der Empfänger gestoppt ist, Anforderungen sind, die Sie fallen lassen dürfen. Eine Cloud-Queue zu wählen, bringt lokale Ansammlung auf der Senderseite nicht automatisch mit, und der Wechsel zu Named Pipes bewahrt das Warten, während die Gegenstelle gestoppt ist, nicht in derselben Form. Wenn Sie es brauchen, geben Sie der Anwendung Neuversand und Pufferung oder behalten Sie eine Queue.
5. Die Tabellen-Queue: Queue-Operation und Geschäftaktualisierung in derselben Datenbank festschreiben
Dieses Kapitel beginnt damit, was es bedeutet, beides in eine Datenbank zu holen. Von dort sieht es nacheinander die Voraussetzungen des Entnahme-SQL, wie weit die Reihenfolge garantiert ist, die Transaktion des Workers und die Verarbeitung, die Sie für den Produktivbetrieb ergänzen an.
5.1. Warum DTC überflüssig wird
Bei MSMQ sind Queue und Datenbank getrennte Ressourcen. „Aus der Queue entnommen“ und „die Geschäftsdaten aktualisiert“ gemeinsam festzuschreiben, erforderte eine verteilte Transaktion über DTC.
Machen Sie die Queue zu einer Tabelle in derselben Datenbank wie die Geschäftsdaten, und beides wird zu Aktualisierungen dieser einen Datenbank. Entnahme, Geschäftaktualisierung und Abschlussdatensatz können in einer einzigen lokalen Transaktion festgeschrieben werden. Eine verteilte Transaktion durch eine lokale zu ersetzen, ist das Herz dieser Migration.
Nicht nur die Empfängerseite: Die Senderseite kann zur selben Zeit festschreiben
Auch auf der Senderseite können die Aktualisierung der Geschäftsdaten und das INSERT der Nachrichtenzeile in dieselbe Transaktion. Das ist das Outbox-Muster und verhindert die Inkonsistenz, dass die Geschäftsdaten aktualisiert sind, aber keine Nachricht hinausgegangen ist.
Was folgt, ist die minimale Form auf SQL Server. Der C#-Teil ist Pseudocode, der die Transaktionsgrenze zeigt; es ist keine fertige Implementierung, die unverändert ausgerollt wird.
5.2. Die Tabelle, die die Aufträge speichert
CREATE TABLE dbo.JobQueue (
Id BIGINT IDENTITY(1,1) PRIMARY KEY,
Payload NVARCHAR(MAX) NOT NULL, -- The body. Held as JSON
Status TINYINT NOT NULL DEFAULT 0, -- 0: pending, 1: in progress, 2: done
EnqueuedAt DATETIME2 NOT NULL DEFAULT SYSUTCDATETIME(),
StartedAt DATETIME2 NULL, -- Used to reclaim rows left in progress by a crash
RetryCount INT NOT NULL DEFAULT 0
);
CREATE INDEX IX_JobQueue_Status ON dbo.JobQueue (Status, Id);
Payload hält den Körper als JSON, und Status unterscheidet ausstehend, in Bearbeitung und erledigt. StartedAt und RetryCount werden für die Rückhol- und Wiederholungsoperationen genutzt.
5.3. Eine Zeile entnehmen und die Datenbankeinstellungen prüfen
Die Zeile, die Sie nehmen, aktualisieren und ihren Körper in einer einzigen SQL-Anweisung holen
Zum Entnehmen aktualisieren Sie eine Zeile auf „in Bearbeitung“ und empfangen dabei den Körper über OUTPUT. READPAST überspringt Kandidaten, auf denen ein anderer Worker eine Zeilensperre hält, statt auf sie zu warten, sodass mehrere Prozesse die Arbeit teilen können.10
WITH next_job AS (
SELECT TOP (1) *
-- READCOMMITTEDLOCK is required on a database where READ_COMMITTED_SNAPSHOT is ON (see below).
-- On a database where it is OFF it matches the default behavior, so leaving it in works for both
FROM dbo.JobQueue WITH (READPAST, UPDLOCK, READCOMMITTEDLOCK)
WHERE Status = 0
ORDER BY Id -- Dequeue in insertion order. This is what makes it a queue
)
UPDATE next_job
SET Status = 1, StartedAt = SYSUTCDATETIME()
OUTPUT inserted.Id, inserted.Payload;
Zuerst die Snapshot-Einstellung und die Isolationsstufe prüfen
Wenn Sie dieses SQL lesen, prüfen Sie READ_COMMITTED_SNAPSHOT und die Isolationsstufe der Sitzung.
Die offizielle Dokumentation hält fest, dass READPAST nicht unverändert angegeben werden kann, wenn READ_COMMITTED_SNAPSHOT der Datenbank ON ist und entweder die Sitzung auf READ COMMITTED steht oder die Abfrage zusätzlich den Hinweis READCOMMITTED verwendet. Die Abhilfe ist, den Hinweis READCOMMITTED zu entfernen, falls einer vorhanden ist, und READCOMMITTEDLOCK aufzunehmen.10
Die Standard-Isolationsstufe ist READ COMMITTED, daher führt das ungeprüfte Übernehmen in eine Snapshot-fähige Datenbank nicht bloß zu Blockieren — die SQL-Anweisung schlägt mit einem Fehler fehl. Azure SQL Database hat es standardmäßig ON. On-Premises kann es auch aktiviert worden sein, um Leseblockaden zu mindern, prüfen Sie also vorher.
SELECT is_read_committed_snapshot_on FROM sys.databases WHERE name = DB_NAME();
Das Entnahme-SQL oben enthält READCOMMITTEDLOCK und liest daher unabhängig von der Snapshot-Einstellung mit Sperren. Auf einer Datenbank, in der die Einstellung OFF ist, entspricht das dem Standardverhalten.10
Warum ROWLOCK nicht daneben steht und die Grenzen von READPAST
Anders als das häufig gesehene WITH (READPAST, UPDLOCK, ROWLOCK) steht ROWLOCK hier nicht daneben. Das liegt daran, dass ROWLOCK und READCOMMITTEDLOCK zur selben Gruppe von Granularitätshinweisen gehören und beide nicht für dieselbe Tabelle angegeben werden können.10
READPAST kann nur Zeilensperren überspringen, keine Seitensperren. Im Rahmen dieses Beispiels, das eine einzelne Zeile über einen TOP (1)-Index-Seek nimmt, ist Eskalation kein praktisches Problem, aber wenn Sie ROWLOCK ausgeschrieben haben wollen, bestätigen Sie, dass READ_COMMITTED_SNAPSHOT OFF ist, und lassen Sie stattdessen READCOMMITTEDLOCK weg.
5.4. Die Entnahmereihenfolge und die Reihenfolge der Aktualisierungen der Geschäftsdaten sind verschiedene Dinge
Für die Kandidatenzeilen eine Reihenfolge angeben
Wenn Sie das ORDER BY weglassen und UPDATE TOP (1) schreiben, ist unbestimmt, welche Zeile gewählt wird. TOP auf einem UPDATE ordnet die betroffenen Zeilen nicht, und allein ein Index auf (Status, Id) ist ebenfalls keine Reihenfolgegarantie. Damit alte Aufträge nicht endlos zurückgedrängt werden, gibt das Beispiel ORDER BY Id an.11
Unter Parallelverarbeitung heißt zuerst heraus nicht zuerst angewendet
Trotzdem ist die Abschlussreihenfolge unter Parallelverarbeitung nicht ausgerichtet. Während Worker A Auftrag 1 verarbeitet, überspringt Worker B diese Zeile über READPAST und kann Auftrag 2 zuerst festschreiben.
| Was ausgerichtet ist | Was nicht ausgerichtet ist |
|---|---|
Welche Zeile zuerst entnommen wird (ORDER BY Id) |
Welche Zeile zuerst auf die Geschäftsdaten angewendet wird |
Wenn die Anwendungsreihenfolge Bedeutung hat — Aktualisierungen gegen dieselbe Auftragsnummer etwa — wählen Sie eine der folgenden Möglichkeiten.
| Wie Sie die Reihenfolge wahren | Was Sie gewinnen und wogegen Sie tauschen |
|---|---|
| Einen einzelnen Konsumenten laufen lassen | Parallelität aufgeben, um Reihenfolge zu bekommen. Die einfachste Option, wenn sie den benötigten Durchsatz noch erfüllt |
| Nach Schlüssel partitionieren | Einen Worker an eine Auftragsnummer oder einen ähnlichen Schlüssel binden oder eine Bedingung hinzufügen, die eine Zeile überspringt, solange derselbe Schlüssel in Bearbeitung ist. Garantiert ist die Reihenfolge innerhalb eines Schlüssels, nicht die Reihenfolge über Schlüssel hinweg |
Wenn Sie keines von beiden wählen, halten Sie im Entwurf ausdrücklich fest, dass unter Parallelverarbeitung kein globales FIFO garantiert ist. Dasselbe Problem entsteht bei MSMQ, sobald Sie parallel empfangen. Was zählt, ist, nicht zu migrieren und dabei noch zu glauben, „es ist eine Queue, also kommt es der Reihe nach heraus“.
5.5. Die Transaktionsgrenze des Workers
Was Sie auf der Empfängerseite ausrichten, ist die Transaktion, die Entnahme, Aktualisierung der Geschäftsdaten und Abschlussdatensatz umfasst. Im Pseudocode unten werden den drei Operationen dieselbe Verbindung und Transaktion übergeben, und sie werden am Ende gemeinsam festgeschrieben.
while (!stoppingToken.IsCancellationRequested)
{
using var tx = connection.BeginTransaction();
var job = DequeueOne(connection, tx); // The UPDATE ... OUTPUT above
if (job is null)
{
tx.Commit();
await Task.Delay(TimeSpan.FromSeconds(1), stoppingToken); // Nothing there: wait one polling interval
continue;
}
ApplyBusinessData(connection, tx, job); // <- Update the business data (the work you actually wanted)
MarkDone(connection, tx, job.Id); // Status = 2
tx.Commit(); // "Dequeue" and "business update" are committed together by this one line
}
Der entscheidende Punkt ist, dass DequeueOne, ApplyBusinessData und MarkDone dieselbe Verbindung und Transaktion nutzen und dass das abschließende Commit Entnahme und Geschäftaktualisierung gemeinsam festschreibt. Wenn Sie das durch einen Broker ersetzen, geht diese Eigenschaft derselben Datenbank verloren, und ein anderer Konsistenzentwurf wird nötig.
5.6. Rückholung, Wiederholung und Aufräumen, die Sie für den Produktivbetrieb ergänzen
Über dem Minimalbeispiel entwerfen Sie die folgenden Operationen.
| Operation | Was sie tut |
|---|---|
| In Bearbeitung zurückgebliebene Zeilen zurückholen | Ein Wiederherstellungsauftrag, der Zeilen auf Status = 0 zurücksetzt, wenn Status = 1 und StartedAt älter als ein festgelegtes Intervall ist |
| Wiederholungsgrenze und Abstellen | Zeilen, deren RetryCount die Grenze überschreitet, in eine getrennte Tabelle oder etwas wie Status = 9 verschieben. Das ist der Ort, der MSMQs Dead-Letter-Queue entspricht |
| Erledigte Zeilen aufräumen | Zeilen mit Status = 2 regelmäßig löschen oder archivieren, damit Tabelle und Indizes nicht aufblähen |
In kleinen und mittleren Fachanwendungen reichen eine Tabelle plus Polling oder eine benachrichtigungsgetriebene Variante oft. Bevor Sie ein weiteres Queue-Produkt hinzufügen, prüfen Sie, ob diese Implementierung die benötigten Eigenschaften und den benötigten Betrieb bereits erfüllt.
6. Umschaltung: Zuerst Format, Verhalten und Empfängerseite ausrichten
Für die Umschaltung richten Sie zuerst das Nachrichtenformat und die Tests über Eingaben und Ergebnisse aus. Danach wählen Sie zwischen Altes und Neues überbrücken und die alte Queue leeren, bevor Sie umschalten.
6.1. Ein Nachrichtenformat festlegen, in dem Altes und Neues koexistieren können
Machen Sie JSON nach der Migration zum Standard. Was Sie nicht mitnehmen, ist BinaryFormatter-basierte Serialisierung wie BinaryMessageFormatter. Die BinaryFormatter-Implementierung wurde in .NET 9 aus der Laufzeit entfernt und ist auch aus Sicherheitsgründen nicht empfohlen.8
Das heißt allerdings nicht, dass jedes Binärformat ausgeschieden ist. Formate, deren Spezifikation unabhängig gepflegt wird, etwa Protocol Buffers und MessagePack, können unverändert ins neue System übernommen werden. Legen Sie Formatter und Körpertyp zuerst in der Bestandsaufnahme in Abschnitt 3.2 fest.
6.2. Bevor Sie umschreiben, Eingaben und Ergebnisse mit Tests festnageln
Queue-Verarbeitung ist ein Bereich, in dem zeitabhängige Fehler leicht entstehen. Bereiten Sie Charakterisierungstests vor, die sagen „diese Eingabenachricht erzeugt dieses Ergebnis“, damit Sie mechanisch prüfen können, dass der Ersatz dasselbe Ergebnis liefert. Siehe auch „Eine Legacy-Business-Anwendung ohne Tests sicher verändern ── Charakterisierungstests und Refactoring in der Praxis“.
6.3. Zuerst die Empfängerseite behandeln und die Brücke um Verlust und Duplikate herum entwerfen
Zuerst die Empfängerseite herüberholen
Zuerst stellen Sie die neue Queue bereit, bringen die Empfängerseite dagegen zum Laufen und schalten erst dann die Senderseite um.
Eine kleine Brücke einzusetzen, die Nachrichten vom alten MSMQ in die neue Queue bewegt, erspart Ihnen, jeden Sender auf einmal umzuschalten. Die Brücke selbst kann auf dem .NET Framework bleiben.
Das Übergabeverfahren danach trennen, ob Transaktionen genutzt werden
Aber wenn es zwischen dem Entnehmen aus MSMQ und dem Schreiben in die neue Queue stoppt, erhalten Sie entweder Verlust oder Doppelzustellung. Entwerfen Sie wie folgt, je nach Art der Quellqueue.
| Quelle | Mindestübergabe |
|---|---|
| Transaktions-Queue | Empfangen Sie transaktional auf der MSMQ-Seite, damit ein fehlgeschlagenes Schreiben zurückgerollt werden kann. Auf der Seite der neuen Queue weisen Sie Duplikate per Nachrichten-ID zurück und verarbeiten idempotent |
| Nicht transaktionale Queue | Mit Peek lesen, idempotent in die neue Queue schreiben, das erfolgreiche Schreiben bestätigen und erst dann aus der alten Queue entfernen. Duplikate durch einen Stopp vor dem Entfernen werden auf der Seite der neuen Queue aufgenommen |
Das transaktionale Attribut einer Queue wird bei der Erstellung festgelegt und kann danach nicht geändert werden. Beachten Sie, dass das transaktionale Empfangsverfahren nicht einfach auf eine nicht transaktionale Queue angewendet werden kann.
6.4. Wenn die Brücke sich nicht lohnt, die Queue leeren und umschalten
Wenn die Maßnahmen gegen Verlust und Duplikate in der Brücke außer Verhältnis zur Größe des Systems stehen, erzwingen Sie nicht das Nebeneinander von Alt und Neu; neigen Sie dazu, die alte Queue in einer geplanten Unterbrechung zu leeren und dann umzuschalten.
Umschalten, während noch Nachrichten in der Queue sitzen, verursacht Doppelverarbeitung und Verlust. Die Queue vor dem Umschalten zu leeren ist am Ende oft der sicherste und schnellste Weg — das ist das praktische Urteil dieses Artikels.
7. Zusammenfassung
Stand Juli 2026, dem Bezugspunkt dieses Artikels, ist MSMQ offiziell nicht deprecated. Als Betriebssystemfunktion fortzubestehen und leicht nach .NET zu migrieren sind zwei verschiedene Dinge. System.Messaging ist auf das .NET Framework beschränkt, daher gilt als Grundsatz: Wenn Sie die Anwendung auf .NET heben, überprüfen Sie die Queue mit.123
Wenn Sie es vorerst weiter nutzen, prüfen Sie den Supportzeitraum des Betriebssystems und richten Sie Aufbau- und Wiederherstellungsverfahren, Queue-Überwachung, eine Aufzeichnung der Konfiguration und eine jährliche Überprüfung der Entscheidung ein. Das große Risiko des Belassens im Ist-Zustand ist nicht nur technisch: Es ist, dass niemand mehr da ist, der es anfassen kann.
Wenn Sie migrieren, nehmen Sie zuerst Abhängigkeiten und Nachrichtenformate auf. Für asynchrone Verarbeitung, die dieselbe Geschäftsdatenbank aktualisiert, ist eine Tabellen-Queue die erste Wahl. Die Konsistenz, die MSMQ plus DTC geliefert haben, kann durch eine lokale Transaktion in dieser einen Datenbank ersetzt werden. Ziehen Sie RabbitMQ oder Azure Service Bus in Betracht, wenn es eine Anforderung gibt, die sie nicht erfüllen kann, etwa Zustellung an mehrere Systeme oder Routing.
Darüber hinaus prüfen Sie die SQL-Isolationsstufe und Hinweise, die Reihenfolge, in der Aktualisierungen unter Parallelität angewendet werden, und die Maßnahmen gegen Verlust und Duplikate in der Brücke. Was zählt, ist nicht zu hetzen, weil „es angeblich eingestellt worden ist“, sondern zu verstehen, wovon Ihr eigenes System abhängt, und auf dieser Grundlage zwischen Behalten und Migrieren zu entscheiden.
Verwandte Artikel
- Wie lange laufen VB6-Anwendungen noch? — Support-Status der Laufzeitumgebung und ein praxisnaher Weg zur .NET-Migration
- Checkliste vor der Migration von .NET Framework zu .NET
- Eine Legacy-Business-Anwendung ohne Tests sicher verändern ── Charakterisierungstests und Refactoring in der Praxis
- Windows-Prozesskommunikation richtig wählen ── Eine Entscheidungstabelle für Named Pipes / TCP / gRPC / Shared Memory / COM
- Der Irrglaube, man könne über TCP pro Send genau eine Einheit empfangen ── Empfangslogik entwerfen, die es als Bytestrom behandelt
- Wenn Sie ein System ohne Quellcode und ohne Dokumentation übernehmen — Ein praktisches Playbook, um es am Laufen zu halten
- Das Datenbankschema Ihrer Business-Anwendung versionieren ── Migrationspraxis gegen „jeder Kunde hat eine andere Datenbank“
Verwandte Beratungsleistungen
KomuraSoft LLC übernimmt Bestandsaufnahmen und Migrationspläne für Legacy-Konfigurationen einschließlich MSMQ, die Migration von .NET Framework zu .NET und die Überarbeitung von Fachanwendungen mit Queue-Verarbeitung.
- Weiternutzung und Migration von Altbeständen
- Wartung und Weiterentwicklung bestehender Windows-Software
- Windows-Anwendungsentwicklung
- Kontakt
Referenzlinks
-
Microsoft Learn, Deprecated features in the Windows client. Die offizielle Liste der Features im Windows-Client, deren aktive Entwicklung beendet ist, also deprecated Features. Dazu, dass Stand Juli 2026 die Liste NTLM, VBScript, WordPad und andere trägt, während MSMQ (Microsoft Message Queuing) nicht verzeichnet ist, und dazu, dass deprecated eine Stufe ist, die „nicht aktiv weiterentwickelt und in einem künftigen Update möglicherweise entfernt“ bedeutet, zu unterscheiden von removed. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Features Removed or No Longer Developed in Windows Server. Die offizielle Liste der aus Windows Server entfernten Features und der nicht mehr weiterentwickelten, also deprecated Features. Dazu, dass MSMQ Stand Juli 2026 nicht verzeichnet ist, einschließlich der Registerkarte Windows Server 2025, und dazu, dass deprecated Komponenten weiter mit Windows Server ausgeliefert werden, gemäß dem Produktlebenszyklus für den Produktivbetrieb unterstützt bleiben und weiter Sicherheits- und Qualitätsupdates erhalten. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, MessageQueue Class (System.Messaging). Dazu, dass die Referenz der Klasse System.Messaging.MessageQueue die Versionen von .NET Framework 1.1 bis 4.8.1 abdeckt und keine Ausgabe für .NET (Core und später) existiert. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, .NET Framework official support policy. Dazu, dass .NET Framework 4.8 als Komponente des Windows-Betriebssystems definiert ist und gemäß der Lebenszyklus-Richtlinie des übergeordneten Produkts (des Betriebssystems) unterstützt wird, auf dem es installiert ist. ↩ ↩2
-
Microsoft Learn (Archiv), Message Queuing Functions, MQSendMessage und MQReceiveMessage. Dazu, dass MSMQs native Win32-API (MQCreateQueue, MQSendMessage, MQReceiveMessage und andere) für C/C++-Anwendungen dokumentiert ist und Queues erstellt sowie Nachrichten gesendet und empfangen werden können, ohne über eine Managed API zu gehen. ↩ ↩2
-
Microsoft Learn, Use the Windows Compatibility Pack to port code to .NET. Dazu, dass das Windows Compatibility Pack (das Paket Microsoft.Windows.Compatibility) rund 20.000 APIs bereitstellt, um Abhängigkeiten von .NET-Framework-exklusiven APIs bei einer Migration zu .NET abzudecken, und dass seine Liste der Technologiebereiche (CodeDom, Konfiguration, Directory Services, Drawing, ODBC, ACL, WCF, die Registry, WMI, Leistungsindikatoren, Windows-Dienste, EventLog und so weiter) kein Messaging (System.Messaging) enthält. ↩ ↩2
-
CoreWCF project, CoreWCF.MSMQ (NuGet) und CoreWCF 1.4.0 Preview release; Microsoft, CoreWCF Support Policy. Dazu, dass CoreWCF ein community-geführtes Projekt ist, das die Serverseite von WCF nach .NET portiert, und dass Microsoft eine offizielle Support-Richtlinie dafür bereitstellt, dass MSMQ-Unterstützung (das Paket CoreWCF.MSMQ) als Teil seiner queue-basierten Transporte veröffentlicht wurde und dass diese MSMQ-Implementierung von einer Community-Portierung der .NET-Framework-Version der System.Messaging-Bibliothek abhängt. ↩ ↩2 ↩3
-
Microsoft Learn, BinaryFormatter migration guide. Dazu, dass BinaryFormatter aus Sicherheitsgründen schrittweise abgeschafft wird, dass ab .NET 9 die Implementierung aus der Laufzeit entfernt ist und standardmäßig nicht genutzt werden kann, und dass sichere Serialisierungsformate wie JSON (System.Text.Json) als Migrationsziele angegeben werden. ↩ ↩2 ↩3
-
Microsoft Learn (Archiv), Express and Recoverable Messaging, System-Generated Queues, Message Queuing (MSMQ). Dazu, dass eine Express-Nachricht sowohl unterwegs als auch nach der Zustellung im RAM gehalten wird und verloren geht, wenn der Computer, der sie hält, oder der Message-Queuing-Dienst stoppt; dass eine recoverable Nachricht auf dem sendenden Computer und auf jedem vermittelnden Computer auf die Festplatte geschrieben und auch an der Zielqueue auf der Festplatte gehalten wird; dass eine öffentliche Queue im Verzeichnisdienst registriert wird, während eine private Queue nur auf dem lokalen Computer registriert und nicht im Verzeichnisdienst veröffentlicht wird; und dass die Journal-Queue, die Kopien aus einer Queue entnommener und bereits gesendeter Nachrichten hält, dass die Dead-Letter-Queue, die nicht zustellbare Nachrichten hält, von MSMQ erzeugte Systemqueues sind. ↩
-
Microsoft Learn, Tabellenhinweise (Transact-SQL). Dazu, dass
READPASTein Hinweis ist, der von anderen Transaktionen gesperrte Zeilen überspringt, ohne sie zu lesen, dass er nur Sperren auf Zeilenebene und nicht auf Seitenebene überspringen kann und dass er nur unter der IsolationsstufeREAD COMMITTEDoderREPEATABLE READangegeben werden kann. Insbesondere zu der Aussage, dass „wenn die DatenbankoptionREAD_COMMITTED_SNAPSHOTaufONgesetzt ist und entweder (a) die Transaktionsisolationsstufe der SitzungREAD COMMITTEDist oder (b) die Abfrage zusätzlich den TabellenhinweisREADCOMMITTEDangibt wahr ist, der TabellenhinweisREADPASTnicht angegeben werden kann. Um den HinweisREADPASTin diesen Fällen anzugeben, entfernen Sie den TabellenhinweisREADCOMMITTED, falls vorhanden, und nehmen Sie den TabellenhinweisREADCOMMITTEDLOCKin die Abfrage auf.“ Siehe dieselbe Seite auch dazu, dassREADCOMMITTEDLOCKREAD COMMITTED-Lesevorgänge unabhängig von der EinstellungREAD_COMMITTED_SNAPSHOTmit Sperren ausführt und dass für eine einzelne Tabelle nicht mehr als ein Granularitätshinweis (PAGLOCK/NOLOCK/READCOMMITTEDLOCK/ROWLOCK/TABLOCK/TABLOCKX) angegeben werden kann. Die datenbankseitige Einstellung lässt sich überis_read_committed_snapshot_onin sys.databases prüfen. ↩ ↩2 ↩3 ↩4 -
Microsoft Learn, TOP (Transact-SQL). Dazu, dass bei Verwendung von TOP mit INSERT, UPDATE, MERGE oder DELETE die referenzierten Zeilen in keiner Reihenfolge angeordnet werden und dass eine Unterabfrage mit TOP und ORDER BY verwendet werden sollte, wenn die Reihenfolge eine Rolle spielt. ↩
Verwandte Artikel
Aktuelle Artikel mit denselben Schlagwörtern führen zu verwandten Themen weiter.
Wie lange laufen VB6-Anwendungen noch? — Support-Status der Laufzeitumgebung und ein praxisnaher Weg zur .NET-Migration
Wie lange laufen VB6-Anwendungen noch? Dieser Artikel ordnet die Asymmetrie zwischen der Support-Richtlinie für die VB6-Laufzeitumgebung ...
Warum Argumente zerbrechen — Die Regeln der Windows-Kommandozeilenargumente
Windows übergibt CreateProcess eine einzige Zeichenfolge, die der Empfänger zerlegt. Behandelt die Regeln von CommandLineToArgvW, CRT und...
Ende der Wartung von Windows-Druckertreibern — Wie Geschäftsanwendungen Bericht- und Etikettendruck vorbereiten
Microsoft stellt v3/v4-Druckertreiber schrittweise ein. Was Windows protected print mode entfernt und wie Geschäftsanwendungen Bericht- u...
Praktische Best Practices für Multithreading: .NET-Edition — Was Sie entscheiden sollten, bevor Sie weitere Threads hinzufügen
Eine praxisnahe Übersicht der Entwurfsregeln, die verhindern, dass Multithreading-Code in .NET/C# gelegentlich abstürzt oder hängen bleib...
WMI/CIM aus C# und PowerShell verwenden ── Praxisleitfaden für Hardwareinformationen, Prozessüberwachung und Remoteabfragen
Die Seriennummer eines PCs auslesen, freien Datenträgerplatz überwachen und Prozessstarts erkennen: Dafür ist WMI/CIM die Standardlösung....
Verwandte Themen
Diese Seiten ordnen den Artikel in einen größeren Leistungs- und Entscheidungskontext ein.
Technische Windows-Themen
Portal zu Windows-Entwicklung, Fehleranalyse und der Nutzung bestehender Assets.
Leistungen zu diesem Thema
Dieser Artikel ist direkt mit den folgenden Leistungen verbunden.
Windows-App-Entwicklung
Geschäftsanwendungen, Geräteintegration und Kommunikationstools von den Anforderungen bis zur Umsetzung.
Wartung und Modernisierung von Windows-Software
Funktionserweiterungen, Wartung und schrittweise Modernisierung bestehender Windows-Software.
Häufige Fragen
Fragen, die in Beratungen zu diesem Artikelthema häufig gestellt werden.
- Wurde MSMQ eingestellt?
- Nein. Stand Juli 2026 taucht MSMQ weder in der Liste der deprecated Features des Windows-Clients noch in der Windows-Server-Liste „Entfernte Features / nicht mehr weiterentwickelte Features“ auf. Es wird nach wie vor als optionales Windows-Feature mit den aktuellen Betriebssystemversionen ausgeliefert. Dass sich die Behauptung „eingestellt“ trotzdem verbreitet hat, liegt daran, dass sie mit der Situation auf der .NET-Seite verwechselt wird. System.Messaging, die Standardklassenbibliothek für den Umgang mit MSMQ, existiert nur im .NET Framework und wurde nie auf .NET (Core und neuer) portiert. Genau genommen gilt also: Als Betriebssystemfunktion besteht es fort, aber es gibt keinen offiziellen Weg, es aus modernem .NET zu nutzen.
- Gibt es keinen Weg, MSMQ aus .NET 8 oder .NET 10 zu nutzen?
- Es gibt keine offizielle Managed API. System.Messaging ist eine API bis .NET Framework 4.8.1 und ist auch nicht im Windows Compatibility Pack (Microsoft.Windows.Compatibility) enthalten. Die native Win32-API von MSMQ (etwa MQSendMessage) per P/Invoke aufzurufen, ist technisch möglich, bedeutet aber, den Bau und die Pflege eines eigenen Wrappers samt Formatter und Transaktionsanbindung zu übernehmen. Auf der Community-Seite veröffentlicht das CoreWCF-Projekt ein Paket für den MSMQ-Transport (CoreWCF.MSMQ), aber das dient dazu, über eine Queue aufgerufene WCF-Dienste auf modernem .NET zu hosten (eine Portierung der Serverseite von WCF) — es ist weder eine allgemeine Queue-API als Ersatz für System.Messaging noch ein Ersatz für den sendenden Client. Die Implementierung hängt zudem von einer Community-Portierung des System.Messaging der .NET-Framework-Version ab. Für Evaluierung oder eine vorübergehende Lebensverlängerung ist es eine gangbare Option. CoreWCF selbst besitzt eine offizielle Support-Richtlinie von Microsoft, doch diese Garantie erstreckt sich nicht automatisch auf die Community-Portierung von System.Messaging, von der diese MSMQ-Implementierung abhängt. Wenn Sie ein Produktivsystem darauf aufbauen wollen, sollten Sie deshalb erst prüfen, ob die verwendete Version unter die Support-Richtlinie fällt und wie mit dem abhängigen Teil umgegangen wird. In der Praxis ist es der richtige Weg, die Queue zu demselben Zeitpunkt zu migrieren, zu dem Sie die Anwendung auf .NET heben.
- Was eignet sich besser als Migrationsziel — RabbitMQ oder Azure Service Bus?
- Bevor Sie sich zwischen den beiden entscheiden, prüfen Sie zunächst, ob sich eine Datenbanktabelle als Queue eignet. Bei den meisten kleinen und mittleren Fachanwendungen, die MSMQ verwenden, ist die Gegenstelle der Queue ein Prozess, der die eigene Datenbank aktualisiert. In diesem Fall lässt sich mit einer Tabellen-Queue „das Entnehmen der Nachricht“ und „die Aktualisierung der Geschäftsdaten“ in derselben lokalen Transaktion wie die Geschäftsdaten festschreiben — das ersetzt die Konsistenz, die MSMQ zusammen mit einer verteilten Transaktion (DTC) geliefert hat, durch einen deutlich einfacheren Mechanismus. Erst wenn eine Tabellen-Queue für eine Anforderung nicht ausreicht — etwa lose gekoppelte Zustellung zwischen mehreren Systemen oder ein Bedarf an hohem Durchsatz —, sollten Sie RabbitMQ in Betracht ziehen, falls die Anforderung stark On-Premises geprägt ist, oder Azure Service Bus, falls sich das in die Cloud verlagern lässt. Diese Reihenfolge scheitert am seltensten.
- Ist die Entscheidung vertretbar, vorerst bei .NET Framework zu bleiben und es unangetastet zu lassen?
- Unter Bedingungen: ja. .NET Framework 4.8 wird als Windows-Komponente entlang des Lebenszyklus des Betriebssystems unterstützt, und auch MSMQ selbst ist nicht deprecated, sodass Sie realistisch davon ausgehen können, dass es „weiterläuft“. Wenn Sie sich trotzdem für das unangetastete Belassen entscheiden, sollten Sie mindestens diese vier Dinge tun: die Aktivierung des MSMQ-Features im Kitting-Verfahren ausdrücklich festhalten, eine Überwachung von Warteschlangenlänge und Journal einrichten, Nachrichtenformat und Verbindungskonfiguration dokumentieren, sowie ein Wiederherstellungsverfahren hinterlegen, falls der zuständige Mitarbeiter wechselt. Das eigentliche Risiko des unangetasteten Belassens ist nicht technischer Natur — es ist, dass niemand mehr da ist, der sich damit auskennt.
Autorenprofil
Profilseite des Artikelautors.
Go Komura
Geschäftsführer von KomuraSoft LLC
Spezialisiert auf Windows-Softwareentwicklung, technische Beratung und Fehleranalyse, insbesondere bei bestehenden Systemen und schwer reproduzierbaren Störungen.