2

Web サイトのメンテナンス タスクのために Quartz.net サーバーを実行しようとしています。WCF アプリケーション (IIS でホストされている) でジョブとトリガーを作成します。そのため、データベース (SQL Server) に格納できます。

今、私は ADO.NET Job Store を理解できません。Quartz.net の web.config 部分は次のとおりです。

<configSections>
    <section name="quartz" type="System.Configuration.NameValueSectionHandler" />
</configSections>
<quartz>
    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
        <add key="quartz.threadPool.threadCount" value="10" />
        <add key="quartz.threadPool.threadPriority" value="Normal" />
        <add key="quartz.jobStore.misfireThreshold" value="60000" />
        <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
        <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.**SqlServerDelegate**, Quartz" />
        <add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
        <add key="quartz.jobStore.dataSource" value="ConnectionString" />
        <add key="quartz.dataSource.ConnectionString.connectionString" value="Server=*;Database=*;Uid=*;Pwd=*" />
        <add key="quartz.dataSource.ConnectionString.provider" value="SqlServer-20" />
        <add key="quartz.scheduler.instanceName" value="PaymentService" />

        <add key="quartz.jobStore.useProperties" value="true" />
</quartz>

そして、ここに私のglobal.asaxがあります:

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();

            JobKey JobKey = new JobKey("GetOrderInfoJob", "Project");
            if (Scheduler.CheckExists(JobKey))
                Scheduler.DeleteJob(JobKey);

            IJobDetail job = JobBuilder.Create<PaymentServiceLogic>()
                .WithIdentity(JobKey)
                .StoreDurably()
                .RequestRecovery()
                .Build();

            TriggerKey triggerKey = new TriggerKey("GetOrderInfoTrigger", "Project");

            TriggerBuilder tb = TriggerBuilder.Create();
            tb.WithIdentity(triggerKey );
            tb.WithSimpleSchedule(a => a.WithIntervalInMinutes(1));
            tb.StartNow();
            tb.ForJob(job);
            ITrigger trigger = tb.Build();
            Scheduler.ScheduleJob(trigger);

            Scheduler.Start();
        }
}

ローカルホストで WCF サービスを開始すると、ジョブの SQL Server の QRTZ_JOB_DETAILS テーブルには 1 つのエントリがありましたが、トリガーはありませんでした。このコードを数回テストしましたが、ジョブが保存されていないため、次の例外があります: トリガージョブを保存できませんでした: トリガーによって参照されるジョブは存在しません。

ジョブのビルドまたは AdoJobStore にバグはありますか?

2 番目の質問は、global.asax で正しいシャットダウンを行う方法についてです。今、私はこの方法を決定しました:

protected void Application_End(object sender, EventArgs e)
        {
            ICollection<IScheduler> all = Factory.AllSchedulers;
            foreach (IScheduler item in all)
            {
                item.Shutdown(true);
            }
        }

Application_Error に独自のロギングを実装します。

4

1 に答える 1

2

1 つの質問で 2 つの質問をするのが良い考えかどうかを確認してください。ただし、最初の質問に対する答えは、変更する必要があるということです。

Scheduler.ScheduleJob(trigger);

Scheduler.ScheduleJob(job, trigger);

前者はジョブが以前にスケジューラーに追加された場合であり、後者はジョブとトリガーの両方を同時に追加する場合です。

于 2013-06-11T08:54:13.133 に答える