Ich bin ein DBA, das passt zu meiner Antwort, aber ich würde Folgendes tun:
- Wenn Sie SQL 2005+ verwenden, verwenden Sie Service Broker, um die Nachrichten in der Datenbank zu speichern, anstatt sie in einer Tabelle zu speichern. Damit erhalten Sie einen Warteschlangenmechanismus, sodass Sie MSMQ loswerden können. Sie haben auch eine Tabelle, aber sie speichert nur das Konversationshandle (im Wesentlichen einen Zeiger auf die Nachricht) zusammen mit der Anzahl der Versuche, diese Nachricht zu senden. Schließlich möchten Sie eine Art "toten Briefkasten", in dem Nachrichten landen, die Ihre Wiederholungsschwelle erreichen.
- Gehen Sie in Ihrem Nachrichtenverarbeitungscode wie folgt vor:
- Starten Sie eine Transaktion
- Eine Nachricht aus der Warteschlange empfangen
- Wenn die Anzahl der Wiederholungen größer als der Schwellenwert ist, verschieben Sie sie in das Feld für tote Briefe und übernehmen Sie sie
- Erhöhen Sie den Zähler in der Tabelle für diese Nachricht
- Nachricht bearbeiten
- Wenn die Verarbeitung erfolgreich war, übergeben Sie die Transaktion
- Wenn die Verarbeitung fehlgeschlagen ist, stellen Sie eine neue Nachricht mit demselben Inhalt in die Warteschlange und führen Sie dann die Transaktion durch
Beachten Sie, dass es keine geplanten Rollbacks gibt. Rollbacks in Service Broker können schlecht sein; Wenn Sie 5 Mal ohne erfolgreichen Empfang zurücksetzen, wird die Warteschlange sowohl für das Einreihen als auch das Ausreihen deaktiviert. Aber Sie möchten trotzdem Transaktionen für den Fall haben, dass Ihr Nachrichtenprozessor mitten in der Verarbeitung stirbt (d. h. der Server abstürzt).