2011-02-25 31 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