2013-02-19 19 views
9

मैं अपने ItemWriter कक्षा में JobParameter और JobExecutionContext ऑब्जेक्ट को पुनर्प्राप्त करना चाहता हूं। कैसे आगे बढ़ें?आइटमवाइटर में जॉब पैरामीटर और जॉबएक्सक्यूशन कॉन्टेक्स्ट कैसे प्राप्त करें?

मैंने StepExecutionListener को लागू करने का प्रयास किया जिसके माध्यम से मैं केवल मूल वर्ग विधियों को बुला रहा हूं। लेकिन यह सफल नहीं है।

अग्रिम धन्यवाद।

+1

मैंने StepExecutionListenerSupport क्लास को विस्तारित करके उपर्युक्त समस्या हल कर दी है। उसके बाद पैरेंट क्लास विधि को ओवरराइड करें जो 'पहले से पहले' सार्वजनिक शून्य से पहले (चरणबद्धता चरण निष्पादन) {// TODO स्वत: जेनरेट की गई विधि इसे stub.stepExecution = stepExecution; } – Smita

उत्तर

15

StepExecutionListener कार्यान्वित करना एक तरीका है। वास्तव में वसंत बैच 1.x में यही एकमात्र तरीका है।

स्प्रिंग बैच 2 से शुरू होने पर, आपके पास एक और विकल्प है: आप जॉब पैरामीटर और जॉब निष्पादन संदर्भ में अपने आइटम लेखक को जो भी प्रविष्टियां इंजेक्ट कर सकते हैं। अपने आइटम लेखक को step स्कोप के साथ बनाएं, फिर आइटम आइटम के इंजेक्शन के मूल्य के लिए #{jobParameters['theKeyYouWant']} या #{jobExecutionContext['someOtherKey']} जैसी अभिव्यक्ति का उपयोग करें।

+1

एड्रियन, क्या आप यह स्पष्ट कर सकते हैं कि जॉबएक्सक्यूशन कॉन्टेक्स्ट को किसी आइटम रीडर, लेखक या प्रोसेसर में इंजेक्ट करने का सही तरीका है: 1) कॉन्फ़िगरेशन में, बीन में इंजेक्ट करें: , फिर 2) बीन में: निजी जॉबएक्सक्यूशन कॉन्टेक्स्ट संदर्भ; (@ वाल्यू की कोई ज़रूरत नहीं है) क्या कुछ याद आ रही है या गलत है? बहुत बहुत धन्यवाद – user1052610

+0

1. आपको बीन चरण चरण की आवश्यकता है, 2. आपको "संदर्भ" संपत्ति के लिए सेटटर की आवश्यकता है। –

+0

एक ही समय में कई नौकरियों को निष्पादित करते समय यह कैसे व्यवहार करता है? कोई थ्रेड सुरक्षित समस्याएं? – rayman

9

चरण प्रसंस्करण से पहले एक विधि कॉल करने के लिए @BeforeStep एनोटेशन का उपयोग करें।

//From the StepExecution get the current running JobExecution object. 
// 
public class MyDataProcessor implements ItemProcessor<MyDataRow, MyDataRow> 
{ 
    private JobExecution jobExecution; 

    @BeforeStep 
    public void beforeStep(StepExecution stepExecution) { 
     jobExecution = stepExecution.getJobExecution(); 
} 
6

एड्रियन शुम का जवाब देने के लिए जोड़ने के लिए, यदि आप एक वर्ग संपत्ति के रूप में इंजेक्ट किया जा करने के लिए हर काम पैरामीटर से बचना चाहते हैं, तो आप सीधे JobParameter की Map रों इस प्रकार इंजेक्षन कर सकते हैं:

@Value("#{jobParameters}") 
private Map<String, JobParameter> jobParameters; 
4

हैं आप वसंत विन्यास फ़ाइल का उपयोग कर रहे हैं, आप के साथ StepExecution वस्तु का उपयोग कर सकते हैं:

<bean id="aaaReader" class="com.AAAReader" scope="step"> 
    <property name="stepExecution" value="#{stepExecution}" /> 
</bean> 

AAAReader वर्ग में आप उचित क्षेत्र बनाने की जरूरत एक डी एक सेटर:

private StepExecution stepExecution; 

public void setStepExecution(final StepExecution stepExecution) { 
    this.stepExecution = stepExecution; 
} 

प्रोसेसर और राइटर कक्षाओं के लिए समान।

+0

बहुत बढ़िया .. मेरे दोस्त के लिए एक दिन बचाओ .. – venugopal