0

私はサービスを持っています:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class PremieraInteraction : ServiceInit, IPremieraInteraction
{
    public PremieraInteraction()
    {
        ISchedulerFactory schedFact = new StdSchedulerFactory();
        // get a scheduler
        IScheduler sched = schedFact.GetScheduler();
        sched.Start();

        // construct job info
        IJobDetail jobDetail = JobBuilder.Create<PremieraUpdate>().WithIdentity("PremieraUpdateJob").Build();

        ITrigger trigger =
        TriggerBuilder.Create().WithIdentity("PremieraUpdateTrigger").StartNow().WithSimpleSchedule(
        x => x.WithIntervalInSeconds(10)).Build();

        sched.ScheduleJob(jobDetail, trigger); 
    }

}

これは仕事です:

public class PremieraUpdate:IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Debug.WriteLine("Fire");
        }
    }

問題は、それが一度しか機能しないことです。スケジューラが 10 秒ごとに繰り返されないのはなぜですか?

4

2 に答える 2

1

Application_Startイベントに備えてファクトリとスケジューラをインスタンス化Global.asax.csし、静的パブリック プロパティに格納することをお勧めします。

  public class Global : System.Web.HttpApplication
  {
    public static ISchedulerFactory Factory;
    public static IScheduler Scheduler;

    protected void Application_Start(object sender, EventArgs e)
    {
      Factory = new StdSchedulerFactory();
      Scheduler = Factory.GetScheduler();
    }
  }

Globalサービス内で、プロパティを介してスケジューラにアクセスできるようになりました。

元。

Global.Scheduler

WCF サービスを使用して、通常は Windows サービスで実行される Quartz サーバーに新しいジョブをスケジュールしていることを願っています。コンストラクターでジョブをスケジュールする代わりに、ジョブの詳細を受け取り、最終的にスケジュールして実行するメソッドでそれを行うことができます。

この実装を使用する場合、サービスをシングルトンとしてマークする必要はありません。

于 2012-06-14T12:53:23.263 に答える
1

サービスが操作を終了すると、スケジューラがガベージ コレクションされる可能性が非常に高くなります。サービス以外にスケジューラを参照するものがないため、これは予想どおりです。

通常、WCF サービスは呼び出しごとに作成されます。これは、サービスを呼び出すたびに、サービスの新しいインスタンスが作成されることを意味します。ほとんどの場合、これは並行性の問題を回避するのに役立つため問題ありませんが、混乱を招く可能性もあります。

あなたの場合、スケジューラへの永続的な参照が必要です。サービスの静的変数から、すべてのスケジューラとその有効期間を認識しているある種のスケジューラ リポジトリまで、さまざまな方法があります。これは、使用状況によって異なります。

テストのために、静的フィールドをサービス クラスに追加できます。これをサービス コールでインスタンス化すると、スケジューラは必要に応じて 10 秒ごとに操作を呼び出す必要があります。

ただし、これはサービスをホストしている場所にも依存します (Web サービス、サービス、コンソール アプリ?)

于 2012-06-14T12:29:20.190 に答える