2011-08-21 137 views
14

我打算编写一个ASP.NET页面来按需触发作业。目前,我使用SimpleTrigger类来触发作业,但__Trigger类没有支持将对象类型作为JobParameters中的值,并且据我所知,在挂钩下使用WCF Tcp绑定将参数传递给作业调度引擎。我想知道如何传递自定义对象(可序列化)作为工作参数。 感谢您的咨询!Quartz Scheduler:如何将自定义对象作为JobParameter传递?

回答

4

当您安排作业时,您可以在JobDetail对象上设置JobDataMap并将其传递给您的调度程序,但在quartz.net tutorial中描述了一些限制。这项工作可以通过访问数据:

JobDataMap dataMap = context.JobDetail.JobDataMap; 

不过我更喜欢访问我的工作配置,通过库注入工作。

+0

感谢您的答复,但我所寻找的是如何通过从外部应用程序的对象。 –

+0

这是我还需要知道的东西...仍在搜索 – evermean

+0

如何在不使用JobDataMap的情况下注入存储库?或者它只是你注入的回购? –

24

有通过一个石英工作执行时可以检索的对象有两种方法:

传递实例的数据图。

// Create job etc... 
var MyClass _myInstance; 
statusJob.JobDataMap.Put("myKey", _myInstance); 
// Schedule job... 

检索作业的Execute()方法的实例是这样的::

public void Execute(IJobExecutionContext context) 
     { 
      var dataMap = context.MergedJobDataMap; 
      var myInstance = (MyClass)dataMap["myKey"]; 

OR

添加当您设置的工作,你的情况下,像这样的关键添加到地图当您将作业设置为调度程序上下文时,实例如下:

ISchedulerFactory schedFact = new StdSchedulerFactory(); 
    _sched = schedFact.GetScheduler(); 
    _sched.Start(); 
    // Create job etc... 
    var MyClass _myInstance; 
    _sched.Context.Put("myKey", myInstance); 
    // Schedule job... 

检索作业的Execute()方法实例是这样的:

public void Execute(IJobExecutionContext context) 
     { 
      var schedulerContext = context.Scheduler.Context; 
      var myInstance = (MyClass)schedulerContext.Get("myKey"); 
+0

使用JobDataMap时,MyClass实例如何被序列化?是否需要用'[Serializable]'来归因? – Dejan

+0

Dejan,我没有使用[Serializable],我的实例检索OK。据我所知,序列化是在Quartz中使用持久JobStore时调用的。请注意,如果序列化,Quartz文档警告不要存储非基元类型:http://quartz-scheduler.org/documentation/best-practices。在此基础上,我的答案中的例子可能对您没有用处。 – hillstuk

2

我是有hillstuk的答案意想不到的结果上面在多线程环境。 下面是使用Newtonsoft我的解决方案...享受

public void InitJob() { 

    MyClass data = new MyClass {Foo = “Foo fighters”}; 

    /* a unique identifier for demonstration purposes.. Use your own concoction here. */ 
    int uniqueIdentifier = new Random().Next(int.MinValue, int.MaxValue); 

    IJobDetail newJob = JobBuilder.Create<MyAwesomeJob>() 
    .UsingJobData("JobData", JsonConvert.SerializeObject(data)) 
    .WithIdentity($"job-{uniqueIdentifier}", "main")     
    .Build(); 

} 

/* the execute method */ 
public class MyAwesomeJob : IJob 
{ 
    public void Execute(IJobExecutionContext context) 
    {     
     var jobData = JsonConvert.DeserializeObject<MyClass>(context.JobDetail.JobDataMap.GetString("JobData"));  
    } 
} 

/* for completeness */ 
public class MyClass { 
    string Foo { get; set; } 
} 
1

你可以把你的实例/对象在IJobDetail。

JobDataMap m = new JobDataMap(); 
    m.Put("Class1", new Class1(){name="xxx"}); 


    IJobDetail job = JobBuilder.Create<Job>() 
      .WithIdentity("myJob", "group1") 
      .UsingJobData(m)//class object 
      .UsingJobData("name2", "Hello World!") 
      .Build(); 

使用

public void Execute(IJobExecutionContext context) 
     { 
JobDataMap dataMap = context.JobDetail.JobDataMap; 
      Class1 class1 = (Class1)dataMap.Get("Class1"); 
string x = class1.name; 
} 
相关问题