1

現在、自分のシステムでタスクをスケジュールするために Quartz.NET を使用して調査しています。私が Quartz.NET をどのように使用しているかの例として、以下はタスクをスケジュールする方法を示す非常に単純な例です。

class Program
{
    static void Main(string[] args)
    {
        var properties = new NameValueCollection();
        properties["quartz.scheduler.instanceName"] = "TestScheduler";
        properties["quartz.scheduler.instanceId"] = "instance_one";
        properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
        properties["quartz.jobStore.useProperties"] = "true";
        properties["quartz.jobStore.dataSource"] = "default";
        properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
        properties["quartz.jobStore.lockHandler.type"] = "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz";
        properties["quartz.dataSource.default.connectionString"] = "Server=.\\SqlExpress;Database=quartz;Trusted_Connection=True;";
        properties["quartz.dataSource.default.provider"] = "SqlServer-20";

        var scheduler = new StdSchedulerFactory(properties).GetScheduler();

        scheduler.Start();

        TriggerSimpleJob(scheduler);

        Console.WriteLine("Waiting For Job");
        Console.ReadLine();
    }

    private static void TriggerSimpleJob(IScheduler scheduler)
    {
        ITrigger trigger = TriggerBuilder.Create()
                              .WithIdentity("trigger1", "group1")
                              .StartAt(DateBuilder.EvenSecondDateAfterNow())
                              .UsingJobData("myTriggerParameter", "myTriggerValue")
                              .UsingJobData("myParameter", "triggerParameter")
                              .Build();

        IJobDetail jobDetail = JobBuilder.Create<SimpleJob>().WithIdentity("job1", "group1")
            .UsingJobData("myParameter", "myValue")
            .Build();

        scheduler.ScheduleJob(jobDetail, trigger);
    }
}

public class SimpleJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
       Console.WriteLine("Job completed");
    }
}

私が持っている質問はこれです:

ジョブの実行からジョブのスケジューリングを切り離したいと思います。

上記の例では、ジョブがスケジュールされた後、スケジュールされた時間にプロセスがまだ実行されている場合、ジョブはこのプロセス内で実行されています。理想的には、ジョブの実行専用の Quartz.NET スケジューラのインスタンスを実行する専用サーバーを用意し、この専用サーバーでジョブが実行されることを認識して他のプロセスからジョブをスケジュールできるようにしたいと考えています。

ジョブをスケジュールするプロセスでプロパティ「quartz.threadPool.threadCount」を「0」に単純に設定しようとしましたが、例外がスローされます。私がやろうとしていることを達成するスケジューラーの構成プロパティはありますか?

4

2 に答える 2

1

おはようございます、

ここで私の答えを読むことができます。

私が提案するのは、ADO.NET Job Storeを使用することです (そして、あなたはそれを使用しているようです)。ジョブのスケジューリングを担当するアプリケーションは、プロパティthreadPoolZeroSizeThreadPoolに設定して構成する必要があります。

properties["quartz.threadPool.type"] = "Quartz.Simpl.ZeroSizeThreadPool, Quartz";

このタイプのスレッドプールの詳細については、こちらを参照してください。

ジョブの実行を担当するアプリケーションは、次の設定で構成する必要があります。

properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "10";
properties["quartz.threadPool.threadPriority"] = "Normal";
于 2013-06-13T10:35:55.557 に答える
0

線を取り除く

 scheduler.Start();
于 2013-06-13T16:02:07.657 に答える