最近、組み込みの Quartz.net スケジューラを 2.x にアップグレードしました。その時点で、ゼロ スレッド スケジューラに一意の名前を付けるのをあきらめなければなりませんでしたが、ZT スケジューラのインスタンスを作成しようとするオブジェクトが (非常にまれに) スローするという問題があります。別のオブジェクトにインスタンス化された ZT スケジューラのインスタンスが既にあり、すべての ZT スケジューラにデフォルトの「QuartzScheduler」名が付けられているため、例外がスローされます...
MySchedFactory.AllSchedulers.Count
呼び出し後に使用してスケジューラーの数を確認しようとしましMySchedFactory = new StdSchedulerFactory(properties)
たが、StdSchedulerFactory は、メソッドが呼び出されたときではなく、インスタンス化されるとすぐに ZT スケジューラーのインスタンスを作成するGetScheduler()
ため、行き止まりです...
インスタンス化する前に既存のスケジューラをチェックする他の方法を見つけることができませんでした。StdSchedulerFactory
すでに述べたように、インスタンス化されるとすぐに ZT スケジューラのインスタンスが作成されるため、catch ブロックで while ループを使用することになりました。ひどい解決策なので、誰かが既存の ZT スケジューラをチェックするより良い方法を知っていることを願っています...
try
{
//setting properties
MySchedFactory = new StdSchedulerFactory(properties);
BaseScheduler = schedFactory.GetScheduler();
}
catch (Exception ex)
{
var exMsg = ex.InnerException == null ?
ex.Message :
ex.Message + Environment.NewLine + ex.InnerException.Message;
while (exMsg.Contains("Scheduler with name 'QuartzScheduler' already exists"))
{
try
{
MySchedFactory = new StdSchedulerFactory(properties);
BaseScheduler = schedFactory.GetScheduler();
}
catch (Exception vex)
{
exMsg = vex.InnerException == null ?
vex.Message :
vex.Message + Environment.NewLine + vex.InnerException.Message;
}
}
}
何か案は?