2009-08-07 5 views
1

IJob이 작업 내에서 데이터를 게시하는 쉬운 방법이 있습니까? 작업이 가져 오기 프로세스를 실행하고 있지만 작업을 조회하고 요청하여 진행률을 검색하려고합니다.Quartz.Net 작업 진행

내가 JobDetails를 사용할 수 있다고 생각했지만 Job 내에서 변경된 내용을 반영하지 않은 것 같습니다.

답변

2

당신이 찾고있는 것을 쉽게 제공 할 수있는 내장 된 방법이 없습니다. 그러나 게시 구독을 통해 다른 시설로 진행 정보를 게시하는 것은 그리 어렵지 않습니다. 또한 주기적으로 진행 정보를 영구 저장소에 기록 할 수 있습니다. 또한 처리 된 마지막 성공 비트를 알면 쉽게 다시 시도 할 수 있습니다.

외부 스레드/프로세스는 가져 오는 대상을 폴링하고 가져올 전체 항목에 대한 정보가있는 경우 상태를 확인할 수도 있습니다.

Quartz.NET 작업은 .. 웰 (well) 단위로 처리되는 단위이므로 아직 수행되지 않은 작업의 개념이 없습니다. 또는 가져 오기 프로세스에 의존하는 다른 작업에서이 정보가 필요합니까?

+0

의미가 있습니다 ... 특정 업무의 프로세스를 볼 필요가있는 webservice 호출을 통해 GUI를 업데이트해야합니까? 솔루션을 약간 재구성해야 할 수도 있습니다. 정적 인 정렬 목록을 사용하여 실행중인 모든 작업의 ​​상태/진행 상태를 저장하는 방법을 생각해보십시오. –

+0

예,이 작업은 보유하고있는 작업의 양에 따라 달라집니다. 관리 가능한 양의 트리거/작업이있는 소규모 배포에서는 정보에 대한 서비스 계층을 폴링하거나 직접 사용자가 시작한 검색을 통해 얻을 수 있습니다. 각 작업 인스턴스 또는 작업 실행에 대해 고유 한 ID를 가질 수 있습니다 (ID는 time + trigger 일 수 있음). 그런 다음 해당 작업에 대한 메타 정보를 업데이트 할 수 있습니다. Quartz는 작업 데이터 맵을 가지고 있지만 시스템 통합을위한 것이 아닙니다. –

3

꽤 가능합니다.

나는 이런 식으로 할 것입니다. 작업에서 :

public virtual void Execute(IJobExecutionContext context) 
{ 
    int i = 0; 
    while (i++ < 100) 
    { 
     context.JobDetail.JobDataMap["progress"] = i; 
     Thread.Sleep(1000); 
    } 
} 

진행 검색하고자하는 코드에서 :

var jobs = scheduler.GetCurrentlyExecutingJobs(); 
foreach (var j in jobs) 
{ 
    Console.WriteLine("Progress of {0} is {1}", 
     j.JobDetail.Key, 
     j.JobDetail.JobDataMap["progress"]); 
} 

당신은 물론, GetCurrentlyExecutingJobs의 결과를 필터링 할 수 있습니다.

또한, DurablePersistJobDataAfterExecution로 작업을 설정할 수 있으므로 완료 후, 당신은 scheduler.GetJobDetail(..)를 통해 진행 상황과 다른 것을 검색 할 수 있습니다, 그 후 그 JobDataMap 접근.

관련 문제