दिलचस्प पोस्ट
मूल्य मिलान मूल्य के लिए NSArray खोजें पायथॉन मुहावरों को श्रृंखला (फ्लैटन) को एक सीमित असीमित चलने वाले यंत्रों के उपयोग में लाया जा सकता है? कैसे लिनक्स पर सी में निर्देशिकाओं की सूची को फिर से सूचीबद्ध करें? कंटेनर से यादृच्छिक तत्व प्राप्त करें क्या जावा में गुणा और विभाजन की तुलना में बिट्स तेजी से बदल रहा है? नेट? VBScript में अपनी स्वयं की प्रक्रिया आईडी खोजें पायथन सूची संरचना में NumPy सरणी परिवर्तित करना? अजगर का उपयोग करके डायनामिक रूप से जेनरेट किए गए वेब पेज पढ़ना एक जावास्क्रिप्ट ऑब्जेक्ट में यूआरएल पैरामीटर कन्वर्ट सूची <T> पर कैसे पुनरावृत्त करें और JSF Facelets में प्रत्येक आइटम को प्रस्तुत करें PHP ORMs: सिद्धांत बनाम प्रस्ताव सी में एक सरणी प्रदर्शित करें Svn diff फ़ाइल कैसे उत्पन्न करें जो कि पैच लागू होती है, जब svn cp या svn mv इस्तेमाल किया गया था? ओब्जेसी लिंकर फ्लैग क्या करता है? प्राइमलिटी टेस्ट के लिए सबसे तेज़ एल्गोरिदम

वसंत बैच में नौकरी के विभिन्न चरणों के बीच हम कैसे डेटा साझा कर सकते हैं?

स्प्रिंग बैच में खुदाई, मैं यह जानना चाहूंगा कि कैसे हम नौकरी के विभिन्न चरणों के बीच डेटा साझा कर सकते हैं?

क्या हम इस के लिए JobRepository का उपयोग कर सकते हैं? यदि हां, तो हम ऐसा कैसे कर सकते हैं?

क्या ऐसा करना / प्राप्त करने का कोई दूसरा तरीका है?

Solutions Collecting From Web of "वसंत बैच में नौकरी के विभिन्न चरणों के बीच हम कैसे डेटा साझा कर सकते हैं?"

StepExecutionContext बीच डेटा को पारित करने के लिए जॉब रिपॉजिटरी अप्रत्यक्ष रूप से प्रयोग किया जाता है (जीन-फिलिप सही है कि ऐसा करने का सर्वोत्तम तरीका है StepExecutionContext में डेटा StepExecutionContext और फिर StepExecutionContext निष्पादन संदर्भ कुंजी को JobExecutionContext को बढ़ावा देने के लिए क्रियान्वित नामित ExecutionContextPromotionListener का उपयोग करें।

यह नोट करने के लिए उपयोगी है कि JobParameter कुंजी को एक StepExecutionContext को बढ़ावा देने के लिए भी एक श्रोता है (और भी अधिक JobParameterExecutionContextCopyListener नामित JobParameterExecutionContextCopyListener ); आप पाएंगे कि आप इन का बहुत उपयोग करते हैं यदि आपका नौकरी कदम एक दूसरे से पूरी तरह से स्वतंत्र नहीं हैं।

अन्यथा आप जेएमएस कतार या (स्वर्ग ना करे) कड़ी मेहनत वाली फाइल स्थान जैसी और अधिक विस्तृत योजनाओं का उपयोग करके चरणों के बीच डेटा गुजर रहे हैं।

संदर्भ में दिए गए आंकड़ों के आकार के अनुसार, मैं यह भी सुझाव देता हूं कि आप इसे छोटा रखें (लेकिन मेरे पास कोई विशेष नहीं है

एक कदम से, आप डेटा को StepExecutionContext में डाल सकते हैं। फिर, एक श्रोता के साथ, आप StepExecutionContext से StepExecutionContext तक डेटा को बढ़ावा दे सकते हैं।

यह JobExecutionContext सभी निम्न चरणों में उपलब्ध है

बेकेअलेफ़ल: डेटा छोटा होना चाहिए। ये संदर्भ JobRepository में क्रमबद्ध करके सहेजे जाते हैं और लंबाई सीमित है (यदि मुझे अच्छी तरह याद है तो 2500 वर्ण)।

इसलिए इन संदर्भों को स्ट्रिंग्स या साधारण मूल्यों को साझा करना अच्छा है, लेकिन संग्रह साझा करने या बड़ी मात्रा में डेटा साझा करने के लिए नहीं।

विशाल मात्रा में डेटा साझा करना वसंत बैच का दर्शन नहीं है। स्प्रिंग बैच अलग-अलग कार्यों का एक सेट है, न कि एक बड़ी व्यावसायिक प्रसंस्करण इकाई।

मैं कहूंगा कि आपके पास 3 विकल्प हैं:

  1. StepContext उपयोग करें और इसे StepContext को बढ़ावा JobContext और आपके पास प्रत्येक चरण से इसकी पहुंच है, जैसा कि आपको आकार की सीमा का पालन करना चाहिए
  2. @JobScope बीन बनाएं और उस बीन पर डेटा जोड़ें, जहां इसे इस्तेमाल करने के लिए इस्तेमाल करें और इसे उपयोग करें (दोष यह है कि यह स्मृति में है और अगर नौकरी विफल हो जाती है डेटा खो जाता है, पुनरारंभ योग्यता के कारण समस्याएं पैदा होती हैं)
  3. हमारे पास बड़े डेटासेट्स की जरूरत है, जो सभी चरणों में संसाधित होते हैं (सीएसवी में प्रत्येक पंक्ति पढ़ें और डीबी को लिखिए, डीबी से पढ़िए, कुल मिलाकर और एपीआई पर भेज दें), हमने वसंत बैच मेटा तालिकाओं के समान डीबी में नई तालिका में डेटा को मॉडल बनाने का फैसला किया JobContext में ids और आवश्यक होने पर पहुंच और सफलतापूर्वक सफलता समाप्त होने पर उस अस्थायी तालिका को हटा दें।

आप जावा बीन ऑब्जेक्ट का उपयोग कर सकते हैं

  1. एक कदम निष्पादित करें
  2. परिणाम जावा ऑब्जेक्ट में स्टोर करें
  3. अगला चरण चरण 1 द्वारा संग्रहीत परिणाम प्राप्त करने के लिए एक ही जावा वस्तु का संदर्भ देगा

इस तरह से आप डेटा का एक विशाल संग्रह स्टोर कर सकते हैं यदि आप चाहते हैं

यहां मैंने एक वस्तु को बचाने के लिए किया है जो कि कदम से बाहर पहुंचा जा सकता है।

  1. ऑब्जेक्ट को नौकरी संदर्भ में सेट करने के लिए श्रोता बनाया गया
 @Component("myJobListener") public class MyJobListener implements JobExecutionListener { public void beforeJob(JobExecution jobExecution) { String myValue = someService.getValue(); jobExecution.getExecutionContext().putString("MY_VALUE", myValue); } } 
  1. कार्य संदर्भ में श्रोता को परिभाषित किया गया
 <listeners> <listener ref="myJobListener"/> </listeners> 
  1. पहलेस्टैप एनोटेशन का उपयोग करके चरण में मान को भस्म किया
 @BeforeStep public void initializeValues(StepExecution stepExecution) { String value = stepExecution.getJobExecution().getExecutionContext().getString("MY_VALUE"); } 

मुझे बैच की नौकरी एक करके एक काम करने के लिए एक काम दिया गया था। प्रत्येक नौकरी दूसरे पर निर्भर करती है। पहले नौकरी परिणाम को परिणामस्वरूप नौकरी कार्यक्रम को निष्पादित करने की आवश्यकता है। मैं नौकरी निष्पादन के बाद डेटा को कैसे पारित करना खोज रहा था। मुझे पता चला कि यह निष्पादन सम्मेलन प्रचार संचार में काम आता है।

1) मैंने "एक्ज़ीक्यूशन कंटैंटप्रोमोशन लिस्टनर" के लिए नीचे की तरह एक बीन डाल दिया है I

 @Bean public ExecutionContextPromotionListener promotionListener() { ExecutionContextPromotionListener listener = new ExecutionContextPromotionListener(); listener.setKeys( new String[] { "entityRef" } ); return listener; } 

2) फिर मैंने अपने कदमों में एक श्रोता को जोड़ा

 Step step = builder.faultTolerant() .skipPolicy( policy ) .listener( writer ) .listener( promotionListener() ) .listener( skiplistener ) .stream( skiplistener ) .build(); 

3) मैंने अपने राइटर चरण के कार्यान्वयन में एक संदर्भ के रूप में stepExcution को जोड़ा है और पहलेस्टिपेप में आबादी है

 @BeforeStep public void saveStepExecution( StepExecution stepExecution ) { this.stepExecution = stepExecution; } 

4) मेरे लेखक के कदम के अंत में, मैं नीचे की तरह की कुंजी के रूप में stepexecution में मूल्यों आबादी

 lStepContext.put( "entityRef", lMap ); 

5) नौकरी के निष्पादन के बाद, मैंने lExecution.getExecutionContext() से मूल्य प्राप्त किया और नौकरी की प्रतिक्रिया के रूप में आबादी हुई।

6) नौकरी प्रतिक्रिया ऑब्जेक्ट से, मुझे मूल्य मिलेगा और अन्य नौकरियों में अपेक्षित मूल्यों को भरना होगा।

उपरोक्त कोड कदम से डेटा को निष्पादित करने के लिए ExecutionContextPromotionListener का उपयोग करते हुए ExecutionContext के लिए है। यह किसी भी चरण में किया जा सकता है।

`एक्जीक्यूशन कॉन्टैक्स प्रमोशन लिस्टनर का उपयोग करें

 public class YourItemWriter implements ItemWriter<Object> { private StepExecution stepExecution; public void write(List<? extends Object> items) throws Exception { // Some Business Logic // put your data into stepexecution context ExecutionContext stepContext = this.stepExecution.getExecutionContext(); stepContext.put("someKey", someObject); } @BeforeStep public void saveStepExecution(Final StepExecution stepExecution) { this.stepExecution = stepExecution; } } 

अब आपको पदोन्नति को जोड़ने की जरूरत है अपने काम करने के लिए लेखक

 @Bean public Step step1() { return stepBuilder .get("step1")<Company,Company> chunk(10) .reader(reader()).processor(processor()).writer(writer()) .listener(promotionListner()).build(); } 

@ बीन सार्वजनिक निष्पादन कान्टेन्तप्रोमोशनलाइस्टनर पदोन्नति () (निष्पादन कान्टेन्तप्रोमोशन लिस्टनर सूचीकर्ता = नया निष्पादनसंचार प्रचार प्रचारक (); listener.setKeys (नया स्ट्रिंग [] {"कुछकुछ"}); listner.setStrict (सही); वापसी सूचीकर्ता; }

अब, step2 में अपने डेटा को नौकरी निष्पादन कंसोर्ट से प्राप्त करें

 public class RetrievingItemWriter implements ItemWriter<Object> { private Object someObject; public void write(List<? extends Object> items) throws Exception { // ... } @BeforeStep public void retrieveInterstepData(StepExecution stepExecution) { JobExecution jobExecution = stepExecution.getJobExecution(); ExecutionContext jobContext = jobExecution.getExecutionContext(); this.someObject = jobContext.get("someKey"); } } 

यदि आप कार्यलेट के साथ काम कर रहे हैं, तो ExecutionContext प्राप्त करने या प्राप्त करने के लिए follwing का उपयोग करें

 List<YourObject> yourObjects = (List<YourObject>) chunkContent.getStepContext().getJobExecutionContext().get("someKey");