2011-08-21 37 views
14

मैं मांग पर नौकरी ट्रिगर करने के लिए एएसपी.NET पृष्ठ लिखने की योजना बना रहा हूं। वर्तमान में, मैं नौकरी को ट्रिगर करने के लिए सरल ट्रिगर क्लास का उपयोग कर रहा हूं लेकिन __ ट्रिगर क्लास में से कोई भी ऑब्जेक्ट प्रकार को जॉब पैरामीटर में मूल्य के रूप में समर्थन नहीं देता है और यह मेरे ज्ञान में आया है कि डब्ल्यूसीएफ टीसीपी बाध्यकारी का उपयोग जॉब शेड्यूलिंग इंजन में पैरामीटर पास करने के लिए हुक के तहत किया जाता है। मैं जानना चाहता हूं कि कैसे कस्टम ऑब्जेक्ट (serializable) को नौकरी पैरामीटर के रूप में पास करना है। आपकी सलाह के लिए धन्यवाद!क्वार्ट्ज शेड्यूलर: कस्टम ऑब्जेक्ट्स को जॉब पैरामीटर के रूप में कैसे पास किया जाए?

उत्तर

4

जब आप एक काम आप JobDetail वस्तु पर एक JobDataMap स्थापित करने और अपने अनुसूचक को यह पारित कर सकते हैं निर्धारित करते हैं, वहाँ कुछ सीमाएं quartz.net tutorial में वर्णित हैं। काम के माध्यम से डेटा का उपयोग कर सकते हैं:

JobDataMap dataMap = context.JobDetail.JobDataMap; 

हालांकि मैं अपने काम विन्यास का उपयोग करना पसंद करते हैं, एक भंडार के माध्यम से काम में इंजेक्ट किया।

डेटा नक्शे में उदाहरण दर्रा:

+0

अपने उत्तर के लिए धन्यवाद, लेकिन मैं क्या देख रहा हूँ कि कैसे बाहरी अनुप्रयोग से वस्तुओं पारित करने के लिए है। –

+0

यह कुछ है जो मुझे जानने की भी आवश्यकता है ... अभी भी – evermean

+0

खोज रहे हैं जॉबडेटा मैप का उपयोग किए बिना आप अपनी रिपोजिटरी कैसे इंजेक्ट करते हैं? या यह केवल रेपो है जिसे आप इंजेक्ट करते हैं? –

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"]; 

या

जोड़ें आप नौकरी सेट करते हैं, इस तरह की एक कुंजी के साथ नक्शा करने के लिए अपने उदाहरण जोड़ने जब आप नौकरी सेट करते हैं तो शेड्यूलर संदर्भ का उदाहरण, इस तरह:

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

जॉबडेटा मैप का उपयोग करते समय, MyClass उदाहरण को क्रमबद्ध कैसे किया जा रहा है? क्या इसे '[सीरियलज़ेबल]' के साथ जिम्मेदार ठहराया जाना चाहिए? – Dejan

+0

डीजन, मैंने [Serializable] का उपयोग नहीं किया है, और मेरे उदाहरण ठीक से पुनर्प्राप्त किए गए हैं। जहां तक ​​मैं कह सकता हूं, जब आप क्वार्ट्ज में लगातार जॉबस्टोर का उपयोग करते हैं तो क्रमबद्धता लागू की जाती है। ध्यान दें कि क्वार्ट्ज डॉक्यूमेंटेशन सीरियलाइजिंग के दौरान गैर-आदिम प्रकारों को संग्रहीत करने के खिलाफ चेतावनी देता है: 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; 
} 
संबंधित मुद्दे