2015-01-15 5 views
0

동시에 두 개의 트리거를 실행하지 말 것을 Quartz.NET에 지시 할 수있는 방법이 있습니까? 즉, A 방아쇠와 B 방아쇠가 정확히 동일한 일정을 가지고 있다면 방아쇠 B은 일정한 시간 동안 기다렸다가 발사됩니까?동시에 트리거되는 것을 방지하기

내 프로그램에서 내 작업이 모두 동일한 파일에서 읽고 동일한 파일을 실행하고 동일한 .exe 파일을 실행할 때 문제가 발생할 수 있음을 알았습니다. 이로 인해 아직 파악하지 못한 잡히지 않은 예외가 발생합니다.

Quartz.NET이 어떻게 처리하는지 잘 모르겠습니다. 그러나 그러한 트리거를 지연시키는 방법이 있습니까? (단 몇 초 만 에라도)?

+0

Quartz.NET 스케줄러 레벨에서가 아니라 동시성을 관리합니다. 을 Job 클래스에 추가 할 수 있습니다. '[DisallowConcurrentExecutionAttribute]'는 주어진 작업의 여러 인스턴스의 동시 실행을 피합니다. 또는 각 작업 내에서'Mutex' 또는'ReaderWriterLock'을 사용하여 공유 자원에 대한 액세스를 동기화 할 수 있습니다. –

답변

1

DisallowConcurrentExecutionAttribute을 사용할 수 있습니다.

[DisallowConcurrentExecutionAttribute] 
class DisallowConcurrentJob : IJob 
{ 
    //Implementation goes here 
} 

그것은 동시에 을 실행 동일한 키 함께 작업 의 여러 인스턴스를 방지 할 수 있습니다.

아주 좋은 설명은 here입니다.

UPDATE : 당신이 트리거/작업이 항상 misfire 지침을 사용하여 실행되는지 확인하려면

:

IJobDetail job1 = JobBuilder.Create<InheritedJob1>() 
    .WithIdentity("DisallowConcurrentJob", "MYGROUP") 
    .RequestRecovery(true) 
    .Build(); 

//Schedule this job to execute every second, a maximum of 5 times 
ITrigger trigger1 = TriggerBuilder.Create() 
    .WithSchedule(SimpleScheduleBuilder.RepeatSecondlyForTotalCount(5) 
     .WithMisfireHandlingInstructionFireNow()) 
    .StartNow() 
    .WithIdentity("DisallowConcurrentJobTrigger", "MYGROUP") 
    .Build(); 

Scheduler.ScheduleJob(job1, trigger1); 

WithMisfireHandlingInstructionFireNow

The job is executed immediately after the scheduler discovers misfire situation. 
+0

그러나 이들은 동일한 키가있는 작업이 아닙니다. – Disasterkid

+0

DisallowConcurrentExecutionAttribute를 사용하면 다른 작업이 대기하거나 단순히 실행되지 않는다는 의미입니까? – Disasterkid

+0

업데이트 된 답변보기 건배. – LeftyX