Как запустить один экземпляр задания за один раз в QuartZ? - PullRequest
0 голосов
/ 29 сентября 2018

Я хочу реализовать Quartz.Net в моем проекте C # .Net.Я синхронизирую 1 FTP и загружаю все файлы каждые 10 минут.Как только я скачаю каждый файл, я собираюсь обработать их все.Если будет больше файлов, это займет больше времени, чем 10 минут.

Как запустить 1 экземпляр задания и, если триггер запускает любой другой экземпляр задания, он не должен запускаться и утилизировать его?

Мой код:

КварцКласс планировщика

public class ResponseFileSyncJobScheduler
{
    public static async Task StartResponsefileSyncker()
    {
        ISchedulerFactory sf = new StdSchedulerFactory();
        IScheduler sched = await sf.GetScheduler();

        //DateTimeOffset runTime = DateBuilder.EvenMinuteDate(DateTimeOffset.UtcNow);

        IJobDetail job = JobBuilder.Create<ResponseFileJob>()
            .WithIdentity("ResponsefileSync", "sgroup")
            .Build();

        ITrigger trigger = TriggerBuilder.Create().WithIdentity("TriggerfileSync", "sgroup")
            .WithDailyTimeIntervalSchedule
            (s => s.WithIntervalInMinutes(10).OnEveryDay())
            .StartAt(DateTime.Now.AddMinutes(1))
            .Build();

        await sched.ScheduleJob(job, trigger);
        await sched.Start();
        await Task.Delay(TimeSpan.FromSeconds(65));
    }
}

Класс работы кварца

public class QuartzJobSOGET : IJob
{
    internal static readonly Task CompletedTask = Task.FromResult(true);

    public virtual Task Execute(IJobExecutionContext context)
    {
        JobKey jobKey = context.JobDetail.Key;

        //Write Date Time to File - to ensure Quartz Scheduler Working   
        WritetoFile(DateTime.Now.ToString());

        //Sync every present file and process 
        //once processed delete file from server and make log, 
        //will take 1 min to process single file (almost)
        SyncResponseFilefromSOGETftp();

        return CompletedTask;
    }
}

1 Ответ

0 голосов
/ 01 августа 2019

Через долгое время я нашел ответ раньше, но не смог написать здесь.

Мы можем использовать атрибут DisallowConcurrentExecution над классом, чтобы остановить несколько выполнений одного задания.

Ссылка: Состояние задания и параллелизм

Однако вы также можете проверить эту ссылку для Git-Issue: (может быть полезно) @ DisallowConcurrentExecution неверная интерпретация в кластерном планировщике

...