2015-01-09 14 views
5

से जॉब पैरामीटर मैं कस्टम आइटम रीडर में नौकरी पैरामीटर इंजेक्ट करने की कोशिश कर रहा हूं। मैंने इस विषय पर सभी स्टैक ओवरफ्लो नोट्स की समीक्षा की है (उदाहरण: How to get access to job parameters from ItemReader, in Spring Batch?), और मुझे लगता है कि यह एक आम दर्द बिंदु है जो ज्यादातर अनसुलझा है। मुझे आशा है कि एक वसंत गुरु (@ माइकल मिनेला कोई भी) इसे देखेगा और कुछ अंतर्दृष्टि प्राप्त करेगा।स्प्रिंग बैच

मुझे यह निर्धारित करने के लिए मिला है कि जॉबपरमीटर 10 रनों में से एक के बारे में उपलब्ध हैं, यहां तक ​​कि कोई कोड या कॉन्फ़िगरेशन परिवर्तन नहीं है। यह एक यादृच्छिक विफलता की बजाय यादृच्छिक सफलता का मामला है, इसलिए यह ट्रैक करने के लिए कड़ी मेहनत कर रहा है।

मैंने डीबगर के साथ वसंत कोड में खोला, और यह निर्धारित किया कि जब यह विफल हो जाता है, तो नाम नौकरी का कोई बीन नहीं होता है जब इंजेक्शन हो रहा है वसंत में पैरामीटर पंजीकृत है।

मैं वसंत 4.1.4 का उपयोग कर रहा वसंत बैच 3.0.2 और वसंत-डेटा-जेपीए 1.7.1 और वसंत-डेटा-कॉमन्स 1.9.1 के साथ, जावा में चल 8.

जावा वर्ग

@Component("sourceSelectionReader") 
@Scope("step") 
public class SourceSelectionReaderImpl 
implements ItemReader<MyThing> { 
    private Map<String,Object> jobParameters; 

// ... snip ... 


    @Autowired 
    @Lazy 
    @Qualifier(value="#{jobParameters}") 
    public void setJobParameters(Map<String, Object> jobParameters) { 
     this.jobParameters = jobParameters; 
    } 
} 

नौकरी लांच पैरामीटर:

launch-context.xml job1 jobid(long)=1 

लांच-context.xml (ऋण फुलाना):

<context:property-placeholder location="classpath:batch.properties" /> 

<context:component-scan base-package="com.maxis.maximo.ilm" /> 

<jdbc:initialize-database data-source="myDataSource" enabled="false"> 
    <jdbc:script location="${batch.schema.script}" /> 
</jdbc:initialize-database> 

<batch:job-repository id="jobRepository" 
    data-source="myDataSource" 
    transaction-manager="transactionManager" 
    isolation-level-for-create="DEFAULT" 
    max-varchar-length="1000"/> 

<import resource="classpath:/META-INF/spring/module-context.xml" /> 

मॉड्यूल-context.xml (ऋण फुलाना):

<description>Example job to get you started. It provides a skeleton for a typical batch application.</description> 

<import resource="classpath:/META-INF/spring/hibernate-context.xml"/> 
<import resource="classpath:/META-INF/spring/myapp-context.xml"/> 

<context:component-scan base-package="com.me" /> 
<bean class="org.springframework.batch.core.scope.StepScope" /> 

<batch:job id="job1"> 
    <batch:step id="step0002" >    
     <batch:tasklet transaction-manager="transactionManager" start-limit="100" > 
      <batch:chunk reader="sourceSelectionReader" writer="selectedDataWriter" commit-interval="1" /> 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 
+0

आप नौकरी कैसे लॉन्च करते हैं? – wassgren

+0

और, आप इंजेक्शन के लिए '@ Lazy' का उपयोग क्यों कर रहे हैं? क्या यह आपके काम के लिए जरूरी है? – wassgren

+0

मैं अब अपने ग्रहण आईडीई के भीतर से नौकरी लॉन्च कर रहा हूं। यह लाइव होने पर कमांड लाइन से लॉन्च किया जाएगा। मैं @Lazy का उपयोग करता हूं क्योंकि यह मुझे इस समस्या को दूर करने और वास्तविक परियोजना के साथ आगे बढ़ने की अनुमति देता है, एक संकल्प लंबित है। पैरामीटर को बीन में लाने के अन्य तरीके हैं लेकिन वे लंबे समय तक समर्थन समस्याओं का निर्माण करेंगे। –

उत्तर

2

महत्वपूर्ण नौकरी पैरामीटर्स को पाने के लिए कदम काम StepScope बीन को परिभाषित करना है और यह सुनिश्चित करना है कि आपका पाठक घटक है।

मैं निम्नलिखित की कोशिश करेंगे:

पहले सुनिश्चित करें कि एक स्टेप-सेम परिभाषित है कि वहाँ हैं। यह जावा विन्यास का उपयोग कर सेटअप करने के लिए अच्छा है:

@Configuration 
public class JobFrameworkConfig { 
    @Bean 
    public static StepScope scope() { 
     return new StepScope(); 
    } 
    // jobRegistry, transactionManager etc... 
} 

फिर, सुनिश्चित करें कि आपके सेम @StepScope -annotation (लगभग के रूप में अपने उदाहरण में) के उपयोग के द्वारा सौतेली दायरे वाला बनाते हैं। @Value इंजेक्ट करें जो @Lazy नहीं है।

@Component("sourceSelectionReader") 
@StepScope // required, also works with @Scope("step") 
public class SourceSelectionReaderImpl implements ItemReader<MyThing> { 
    private final long myParam; 

    // Not lazy, specified param name for the jobParameters 
    @Autowired 
    public SourceSelectionReaderImpl(@Value("#{jobParameters['myParam']}") final long myParam) { 
     this.myParam = myParam; 
    } 

    // the rest of the reader... 
} 
+0

धन्यवाद - बीन प्रारंभ होता है लेकिन चरण स्कॉप्ड जॉब पैरामीटर उपलब्ध नहीं है। @StepScope का उपयोग कर, सेम प्रारंभ करने में विफल रहता है: अंतिम वर्ग वर्ग com.sun.proxy उपवर्ग नहीं किया जा सकता $ Proxy42 \t org.springframework.cglib.proxy.Enhancer.generateClass (Enhancer.java:446) पर ..।आदि –

+0

@ pojo-guy, अजीब विफलता। कृपया ध्यान दें कि 'स्टेपस्कोप' नामक एक कक्षा है और '@ स्टेपस्कोप 'नामक एक टिप्पणी है। असुविधाजनक;) – wassgren

+0

एक और धागे पर, स्टेपस्कोप के साथ आकस्मिक प्रॉक्सीइंग पर चर्चा की गई। प्रति @ माइक मानेला (स्प्रिंग बैच टेक लीड) स्टेपस्कोप स्कोप ("चरण", ...) के लिए शॉर्टकट सुविधा है। इसके लिए संकल्प सही पैरामीटर के साथ स्कोप एनोटेशन को समझना और लागू करना है जब मुझे कोई मौका मिलेगा तो मैं इन्हें लागू करूंगा और परिणामों की रिपोर्ट करूंगा। –

-1

कोशिश @Component के बाद जोड़ने @DependsOn ("jobParameters") ("sourceSelectionReader")

+0

यह सिर्फ पुष्टि करता है कि नौकरी पैरामीटर नामक कोई बीन नहीं है। @Scope ("step") का उपयोग करके –

संबंधित मुद्दे