2011-02-25 2 views
3

이미 생성 된 & 초기화 된 개체에서 Quartz가 트리거를 시작하도록하려면 어떻게해야합니까?Quartz.NET 트리거를 설정하여 특정 개체 인스턴스에 대해 실행

public class Foo : IJob 
{ 
    public Foo (configuration items ...) { } 
} 

// Calling Code... 
Foo f = new Foo(/*Non empty constructor*/); 
Schedular sched = new SchedulerFactory().GetScheduler(); 
JobDetail jD = new JobDetail("fooDetail", null typeof(Foo)); 
Trigger trig = TriggerUtils.MakeSecondlyTrigger(15); 
sched.ScheduleJob(jD, trig); 
sched.Start(); 

foo에는 0 인수 생성자가 없습니다. Quartz.NET은 Job을 인스턴스화하고 실행하는 데 문제가 있습니다. Quartz가 Foo의 인스턴스를 트리거 할 수있는 방법이 있습니까?

Quartz 및 그 사용법에 대한 근본적인 사실을 놓치고있는 경우 용서해주세요.

답변

0

Quartz.NET documentation 상태 : (! 아주 작은 쓰기에서)

각 (모든) 스케줄러가 작업을 실행 시간, 그것은 그것 (실행 호출하기 전에 클래스의 새 인스턴스를 만듭니다. .) 방법. 이 행동의 파생물 중 하나는 일자리가 무의미한 생성자를 가져야한다는 사실입니다.

따라서 복잡한 생성자가있는 잡을 갖는 것이 좋습니다. 플랜 B에 대한

시간 :

나는 하나의 '마스터'작업을 만들었습니다. 이 작업은 컨텍스트에서 보았습니다 .JobDetail.JobDataMap은 어떤 유형의 작업이 인지를 확인하고 실제로이 실행되어야 하는지를 결정합니다. 마스터 작업은 예를 들어, 발사 할 때마다이 작업이 실행되도록 예약하고 작업 인스턴스 이전에 생성 할 수 있습니다

public void Execute(JobExecutionContext context) 
{ 
    JobDataMap dataMap = context.JobDetail.JobDataMap; 

    // Execute the stored Task 
    Foo taskToExecute = dataMap["Task"] as Foo; 
    if (taskToExecute != null) 
    { 
     taskToExecute.Execute(); 
    }   
} 

다음 실행 기능은 좀처럼 보였다

JobDetail detail = new JobDetail("foo", null, typeof(MasterTask)); 
detail.JobDataMap["Task"] = task; 

이것은 약간의 마스터 쿼츠 규칙을 위반한다고 확신하지만, 적어도 수행해야 할 작업을 수행 할 수 있습니다.

3

DI 컨테이너를 사용하는 Quartz.Spi.IJobFactory을 구현하여 작업 생성 및 초기화 방법을 정의 할 수 있습니다. Quartz는 이미 초기화 된 작업을 스케쥴하는 것을 허용하지 않는다.

여기에 unity을 사용하여 작업을 만드는 JobFactory가 있습니다. 컨테이너에서 작업 유형을 등록하고 컨테이너가 작업을 구성하는 방법과 작업의 종속성을 해결하는 방법을 정의 할 수 있습니다.

public class UnityJobFactory : IJobFactory { 

    public UnityJobFactory(IUnityContainer container) { 
     Container = container; 
    } 

    public IUnityContainer Container { get; private set; } 

    public IJob NewJob(TriggerFiredBundle bundle) { 
     try { 
      return Container.Resolve(bundle.JobDetail.JobType, null) as IJob; 
     } 
     catch (Exception exception) { 
      throw new SchedulerException("Error on creation of new job", exception); 
     } 
    } 
} 
+0

var myJobListener = new YourClassImplementingIJobListener(param1, param2); sched.ListenerManager.AddJobListener(myJobListener,GroupMatcher<JobKey>.GroupEquals("myJobGroup")); 

더 많은 정보 그래서, "정상적인 quartz.net"항목은 실패하기 시작했다. ("Quartz.Job.FileScanJob, Quartz") ... 어떻게 처리 했습니까? 콘크리트를 스스로 등록 했습니까? (나는 Unity.config 참고 자료를 사용하고있다). – granadaCoder

관련 문제