2011-02-25 33 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計劃:

我創建了一個 '大師' 工作。該作業在context.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; 

我敢肯定這違反了一些主要的Quartz規則,但它至少意味着我可以做什麼需要做!

3

您可以實現自己的Quartz.Spi.IJobFactory(使用DI容器)來定義如何創建和初始化作業。 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 FYI)。 – granadaCoder 2014-02-07 19:01:58