2011-08-21 129 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; 
} 
相關問題