2

最近、組み込みの 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;
                }                    
            }
        }

何か案は?

4

2 に答える 2

2

新しいものを作成するのではなく、シングルトンとしてスケジューラ ファクトリへの参照を保持するのはどうですか?

于 2013-04-09T11:44:43.573 に答える
1

Quartz.net スケジューラーはシングルトンでなければなりません。ここで何かを読むことができます。

于 2013-04-09T11:47:23.357 に答える