Quartz.net Scheduler使用群集

时间:2014-12-15 10:00:31

标签: c# .net quartz-scheduler quartz.net

我正在使用群集选项,我遇到了一些问题:

  1. 当我使用两台机器时,我创建的作业在开始时运行而没有连接到他们的定义。 例如:如果我将作业定义为每10秒钟运行一次,它可以在开始时每两秒运行一次,并且仅在第二天运行它 - 每十秒运行一次。

  2. 这两台机器在同一分钟内完成相同的工作(但不是在同一毫秒内),并且两次一起运行作业,我试图使用锁处理程序属性,但也许我没有定义它以及..

  3. 这是我的代码:

    NameValueCollection properties = new NameValueCollection();
    
    properties["quartz.scheduler.instanceName"] = "TestSchedulerNECH";
    properties["quartz.scheduler.instanceId"] = "instance_one";
    properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
    properties["quartz.threadPool.threadCount"] = "200";
    properties["quartz.threadPool.threadPriority"] = "Normal";
    properties["quartz.jobStore.misfireThreshold"] = "60000";
    properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
    properties["quartz.jobStore.useProperties"] = "false";
    properties["quartz.jobStore.dataSource"] = "default";
    properties["quartz.jobStore.tablePrefix"] = "QRTZ_";
    properties["quartz.jobStore.clustered"] = "true";
    properties["quartz.jobStore.lockHandler.type"] = "Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz";
    properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz";
    properties["quartz.dataSource.default.connectionString"] = "Server=localhost;Database=mydb;Trusted_Connection=False;User=admin;Password=123456";
    properties["quartz.dataSource.default.provider"] = "SqlServer-20";
    
    
    ISchedulerFactory sf = new StdSchedulerFactory(properties);
    IScheduler sched = sf.GetScheduler();
    
    string schedId = sched.SchedulerInstanceId;
    
    for (int i = 1; i <= 5; i++)
    {
    
    IJobDetail job = JobBuilder.Create<SimpleRecoveryJob>()
        .WithIdentity("job_" + i, schedId)
        .RequestRecovery(false)
        .Build();
    
    ITrigger trigger = TriggerBuilder.Create()
        .StartAt(DateBuilder.FutureDate(10, IntervalUnit.Second))
        .WithCronSchedule("0/10 * * * * ? *")
        .ForJob(job)
        .EndAt(DateBuilder.FutureDate(3, IntervalUnit.Minute))
        .Build();
    
    sched.ScheduleJob(job, trigger);
    }
    
    sched.Start();
    

    有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

我知道这是一个旧线程,但是如果我们想要禁止并发执行,我们必须将DisallowConcurrentExecution属性添加到作业类。