2015-09-18 4 views
5

मैं एक स्प्रिंग बैच बनाने की कोशिश कर रहा हूं और मुझे इसके साथ कोई अनुभव नहीं है।वसंत में चरणों के बीच जानकारी पास?

क्या प्रत्येक बैच चरण से जानकारी पास करना संभव है या क्या वे पूरी तरह से स्वतंत्र होना चाहिए?

उदाहरण के लिए अगर मैं

<batch:step id="getSQLs" next="runSQLs"> 
     <batch:tasklet transaction-manager="TransactionManager" 
      ref="runGetSQLs" /> 
    </batch:step> 

    <batch:step id="runSQLs"> 
     <batch:tasklet transaction-manager="TransactionManager" 
      ref="runRunSQLs" /> 
    </batch:step> 

और getSQLs है एक सेम जो एक वर्ग किस प्रकार स्ट्रिंग की एक सूची उत्पन्न कार्यान्वित से चलाता है। क्या RunSQLs द्वारा ट्रिगर किए गए बीन के लिए उस सूची को संदर्भित करना संभव है? ("ट्रिगर" सही शब्द नहीं हो सकता है लेकिन मुझे लगता है कि आप जानते हैं कि मैं क्या मतलब है)

अद्यतन:

<bean id="runGetSQLs" class="myTask" 
    scope="step"> 
    <property name="filePath" value="C:\Users\username\Desktop\sample.txt" /> 
</bean> 

जो myTask वर्ग जो इस विधि कार्यान्वित चलाता है: तो getSQLs कदम इस सेम से चलाता है

@Override 
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { 

    ExecutionContext stepContext = this.stepExecution.getExecutionContext(); 
    stepContext.put("theListKey", sourceQueries); 

    return RepeatStatus.FINISHED; 
} 

क्या मुझे किसी भी तरह से निष्पादन विधि के लिए चरण निष्पादन की आवश्यकता है?

उत्तर

6

स्प्रिंग बैच भविष्य के नौकरी के चरणों में डेटा को धक्का देने का समर्थन करता है, और यह ExecutionContext के माध्यम से किया जा सकता है, अधिक सटीक JobExecutionContext। यहाँ मैं example from the official documentation की चर्चा करते हुए कर रहा हूँ, के रूप में यह मेरे लिए परम संदर्भ है:

बनाने के डेटा भविष्य कदम के लिए उपलब्ध है, यह बाद कदम समाप्त हो गया है जा नौकरी ExecutionContext करने के लिए "पदोन्नत" करना होगा । स्प्रिंग बैच इस उद्देश्य के लिए ExecutionContextPromotionListener प्रदान करता है।

श्रोता अपने कदम के साथ कॉन्फ़िगर किया जाना चाहिए, भविष्य लोगों के साथ एक डेटा साझा:

<batch:step id="getSQLs" next="runSQLs"> 
    <batch:tasklet transaction-manager="TransactionManager" 
     ref="runGetSQLs" /> 
    <listeners> 
     <listener> 
      <beans:bean id="promotionListener" class="org.springframework.batch.core.listener.ExecutionContextPromotionListener"> 
       <beans:property name="keys" value="theListKey"/> 
      </beans:bean> 
     </listener> 
    </listeners> 
</batch:step> 

<batch:step id="runSQLs"> 
    <batch:tasklet transaction-manager="TransactionManager" 
     ref="runRunSQLs" /> 
</batch:step> 

डेटा अपने निष्पादन कोड ब्लॉक से भर जाएगी इस प्रकार है:

// ... 
ExecutionContext stepContext = this.stepExecution.getExecutionContext(); 
stepContext.put("theListKey", yourList); 

फिर बाद के चरणों में, List को @BeforeStep के साथ एनोटेटेड पोस्ट गणना गणना हुक के साथ पुनर्प्राप्त किया जा सकता है:

@BeforeStep 
public void retrieveSharedData(StepExecution stepExecution) { 
    JobExecution jobExecution = stepExecution.getJobExecution(); 
    ExecutionContext jobContext = jobExecution.getExecutionContext(); 
    this.myList = jobContext.get("theListKey"); 
} 
+0

मेरे कोड stepExecution पहचान करने के लिए प्रतीत नहीं होता। मैंने org.springframework.batch.core.StepExecution आयात किया। मुझे यहां क्या समझ नहीं आ रहा है? – user2665166

+0

आपको अपने कोड ब्लॉक के साथ पोस्ट को अपडेट करना चाहिए और उल्लेख करें कि आपने अभी तक क्या किया है। – tmarwen

+0

अपडेट किया गया। मैंने आपके उदाहरण से मेल खाने के लिए कदम भी बदल दिया। – user2665166

0

जावा कॉन्फ़िगरेशन तरीका।

चरण 1: कॉन्फ़िगर ExecutionContextPromotionListener

@Bean 
    public ExecutionContextPromotionListener executionContextPromotionListener() 
    { 
     ExecutionContextPromotionListener executionContextPromotionListener = new ExecutionContextPromotionListener(); 
     executionContextPromotionListener.setKeys(new String[] {"MY_KEY"}); 
     return executionContextPromotionListener; 

    } 

चरण 2: ExecutionContextPromotionListener
@Bean साथ कदम कॉन्फ़िगर

public Step myStep() { 
     return stepBuilderFactory.get("myStep") 
       .<POJO, POJO> chunk(1000) 
       .reader(reader()     
       .processor(Processor()) 
       .writer(Writer() 
       .listener(promotionListener()) 
       .build(); 
    } 

चरण 3: प्रोसेसर में डेटा तक पहुंच हो

@BeforeStep 
    public void beforeStep(StepExecution stepExecution) { 
     jobExecutionContext = stepExecution.getJobExecution().getExecutionContext(); 
     jobExecutionContext.getString("MY_KEY") 
    } 

चरण 4: प्रोसेसर में स्थापित करने के डेटा

@BeforeStep 
     public void beforeStep(StepExecution stepExecution) { 
      stepExecution.getJobExecution().getExecutionContext().put("MY_KEY", My_value); 
     } 
संबंधित मुद्दे