2012-10-08 14 views
18

मुझे आश्चर्य है कि क्वार्ट्ज में बाहरी रूप से एक आवृत्ति चर कैसे पारित किया जाए?क्वार्ट्ज नौकरी में इंस्टेंस चर कैसे पास करें?

नीचे छद्म कोड है जिसे मैं लिखना चाहता हूं। मैं इस नौकरी में बाहरी प्रवेश कैसे कर सकता हूं?

public class SimpleJob implements Job { 
     @Override 
     public void execute(JobExecutionContext context) 
       throws JobExecutionException { 

      float avg = externalInstance.calculateAvg(); 
     } 
} 
+0

में – Anshu

उत्तर

39

आप schedulerContext.When में अपने उदाहरण रख सकते हैं आप नौकरी शेड्यूल करने के लिए जा रहे हैं, बस से पहले कि आप नीचे कर सकते हैं:

public class SimpleJob implements Job { 
    @Override 
    public void execute(JobExecutionContext context) 
      throws JobExecutionException { 
     SchedulerContext schedulerContext = null; 
     try { 
      schedulerContext = context.getScheduler().getContext(); 
     } catch (SchedulerException e1) { 
      e1.printStackTrace(); 
     } 
     ExternalInstance externalInstance = 
      (ExternalInstance) schedulerContext.get("ExternalInstance"); 

     float avg = externalInstance.calculateAvg(); 
    } 
} 
:

getScheduler().getContext().put("externalInstance", externalInstance); 

अपनी नौकरी वर्ग नीचे जैसा होगा

यदि आप वसंत का उपयोग कर रहे हैं, तो आप वास्तव में पूरे आवेदन को इंजेक्ट करने के लिए वसंत के समर्थन का उपयोग कर सकते हैं जैसे Link

+0

यह धारावाहिक वस्तुओं के लिए ठीक काम करता है, और यह उन कक्षाओं के लिए काम करेगा जिनके पास आपके पास पहुंच है। अगर मैं बाहरी जार से कुछ इंजेक्ट करना चाहता हूं तो क्या होगा? उदाहरण के लिए, मैं एक स्टेटफुल जोब लिखने की कोशिश कर रहा हूं जो एक निश्चित तारीख के बाद से सभी फ़ाइलों को एक एस 3 बाल्टी में सूचीबद्ध करता है और जॉबडैंटमैप में सूचीबद्ध फ़ाइलों को संग्रहीत करता है। मैं अपने काम में एक स्प्रिंग कॉन्फ़िगर किया गया AmazonS3Client इंजेक्ट करना चाहता हूं। मैं ऐसा नहीं कर सकता क्योंकि वह वर्ग धारावाहिक नहीं है, और इसलिए मुझे एक एस 3 क्लाइंट के निर्माण को प्रबंधित करने के लिए गुप्त कुंजी, पहुंच कुंजी और कोड लिखना है। क्या यह करने का सबसे अच्छा तरीका है? कोई भी सुझाव महत्वपूर्ण है। –

+0

मेरे अपने प्रश्न का उत्तर - नौकरी को स्वचालित रूप से, यह वास्तव में ऑनलाइन अच्छा समाधान मिला - http://stackoverflow.com/questions/4258313/how-to-use-autowired-in-a-quartz-job –

+1

उत्कृष्ट काम। मेरी मदद की। –

5

काम का समय निर्धारण करते समय एक ट्रिगर का उपयोग कर, आप JobDataMap कि JobDetail में जोड़ा जाता है परिभाषित होता। वह जॉबडेंट ऑब्जेक्ट JobExecutionContext में execute() विधि में आपके Job में मौजूद होगा। तो, आपको JobDataMap के माध्यम से अपने बाहरी प्रवेश को पारित करने का एक तरीका पता होना चाहिए। HTH।

+0

बाहरी उदाहरण मैं किसी भी कस्टम डेटा प्रकार हो सकता है इसका मतलब यह आपके काम में externalInstance सम्मिलित करें IFace

Map<JobKey,Object> map = new HashMap<>(); 

में,, देशी डेटा प्रकार के लिए सीमित स्ट्रिंग, फ्लोट की तरह नहीं , Int आदि। मैंने प्रलेखन से पढ़ा है, यह कहता है कि उदाहरण को क्रमबद्ध करने की आवश्यकता है। – janetsmith

+0

हमारे मामले में, काम करने के लिए ऑब्जेक्ट्स डीबी ऑब्जेक्ट्स हैं, इसलिए हमने जॉबडेटा मैप में उन्हें डीबी से पुनर्प्राप्त करने के लिए मापदंडों का संग्रह किया और निष्पादन विधि में उन्हें पुनर्प्राप्त किया। इसलिए, आपको कुछ स्टोर से बाह्य उदाहरण पुनर्प्राप्त करने के लिए आवश्यक जानकारी को पारित करने के लिए एक तरीका जानने की आवश्यकता है यदि आप उन सभी को क्रमबद्ध करने योग्य नहीं बना सकते हैं। – Vikdor

0

यह उत्तरदायित्व है JobFactory की क्षमता। डिफ़ॉल्ट PropertySettingJobFactory कार्यान्वयन schdeuler संदर्भ, ट्रिगर, और नौकरी के विवरण में पाए गए गुणों के आधार पर किसी भी बीन-सेटर विधियों का आह्वान करेगा। तो जब तक आप एक उचित setContext() सेटर विधि implemnted है आप निम्न कोई भी कार्य करने के लिए सक्षम होना चाहिए:

scheduler.getContext().put("context", context); 

या

Trigger trigger = TriggerBuilder.newTrigger() 
    ... 
    .usingJobData("context", context) 
    .build() 

या

JobDetail job = JobBuilder.newJob(SimpleJob.class) 
    ... 
    .usingJobData("context", context) 
    .build() 

या अगर कि isn पर्याप्त नहीं है कि आप अपना खुद का JobFactory कक्षा प्रदान कर सकते हैं जो आपको जॉब ऑब्जेक्ट्स को तत्काल करता है।

0

एक त्रुटि को एक HashMap के साथ एक आवश्यक इंटरफ़ेस बनाकर इस समस्या को हल करें।

इस क्वार्ट्ज Job कक्षा में इस इंटरफ़ेस को कार्यान्वित करें यह जानकारी पहुंच योग्य होगी।

Job

map.get(context.getJobDetail().getKey()) => will give you Object 
संबंधित मुद्दे