Quartz.NET je plánovač spouštění úloh v rámci procesu aplikace. Úlohy se plánují tak, že se vytvoří Job (spouštěná úloha) a k němu triggery (kdy se spouští). Quartz.NET umí navíc plány perzistovat do databáze, což může být šikovné k tomu, aby se úloha plánu spustila i tehdy, pokud aplikace v okamžiku, kdy měla být úloha spuštěna, z jakéhokoliv důvodu neběžela – misfire. Obdobně umožní spustit job, který z nějakého důvodu nedoběhl (pád, vypnutí stroje) – recovering.
Tím, že je plán perzistentní, není vhodné jej vytvářet se při každém startu aplikace, protože tím by úplně přišlo o výhody perzistence. Plán vytváříme pouze při aktualizaci aplikace.
Existující plán se smaže Clear na Scheduleru – scheduler.Clear(). Problémem však je, že toto nesmaže plán recovering jobů. Nikdy. Pokud tedy takto smažeme plán a vytvoříme nový, plán recovering jobů zůstává zachován. Po nastartování plánovače jsou recovering joby okamžitě spuštěny.
Řešením může být rozšíření metody ClearData třídy SqlServerDelegate (pokud je perzistováno do SqlServeru touto třídou). Tato metoda je volána pod pokličkou v rámci volání scheduler.Clear(). Rozšíříme ji o volání metody DeleteFiredTriggers.
public class MySqlServerDelegate : SqlServerDelegate { public override void ClearData(ConnectionAndTransactionHolder conn) { base.ClearData(conn); DeleteFiredTriggers(conn); } }
Dále musí být scheduleru řečeno, že má tuto třídu používat. Při použití rozšíření Quartz.NET o intergraci s Windsor Castle pomocí NuGet balíčku Quartz.Windsor se název typu s assembly uvádí v konfiguraci pod klíč
<item key="quartz.jobStore.driverDelegateType">...</item>