Jsem DBA, takže moje odpověď je příchutí, ale udělal bych toto:
- Používáte-li SQL 2005+, použijte Service Broker k ukládání zpráv do databáze místo jejich ukládání do tabulky. Získáte tím mechanismus pro řazení do fronty, takže se můžete zbavit MSMQ. Budete mít také tabulku, ale ta bude pouze ukládat popisovač konverzace (v podstatě ukazatel na zprávu) spolu s tím, kolikrát se o tuto zprávu pokusil. A konečně budete chtít nějakou „mrtvou schránku“, kam chodí zprávy, které dosáhnou prahu opakování.
- V kódu pro zpracování zpráv proveďte následující:
- Zahájit transakci
- Přijmout zprávu mimo frontu
- Pokud je počet opakování větší než prahová hodnota, přesuňte jej do schránky s mrtvou poštou a potvrďte
- Zvýšit počítadlo na stole pro tuto zprávu
- Zpracujte zprávu
- Pokud bylo zpracování úspěšné, potvrďte transakci
- Pokud se zpracování nezdařilo, vložte do fronty novou zprávu se stejným obsahem a poté transakci potvrďte.
Všimněte si, že nejsou žádná plánovaná vrácení zpět. Vrácení změn v Service Broker může být špatné; pokud se 5krát vrátíte zpět bez úspěšného příjmu, fronta bude deaktivována pro řazení i vyřazování z fronty. Stále však chcete mít transakce pro případ, že váš procesor zpráv uprostřed zpracování zemře (tj. server se zhroutí).