मैं एक स्प्रिंग बैच नौकरी स्थापित कर रहा हूं जो एक बहु-रिकॉर्ड फ़ाइल को संसाधित करेगा। रिकॉर्ड में से एक में निम्नलिखित संरचना है।
Ind,RecCode,AccNum,RecTypeDesc,EffectiveDate,CreditAmount,DebitAmount,BatchNumber,NumberOfTrasactions
5, 20, 100, prl, 12084, as0, 0, 3, 1
रिकॉर्डकोड फ़ील्ड में मान के आधार पर, यह या तो भुगतान रिकॉर्ड या उलट रिकॉर्ड होगा।
मैं फ़ाइल में रिकॉर्ड प्रकारों को पढ़ने के लिए PatternMatchingCompositeLineMapper की स्थापना कर रहा हूं। मैंने निम्नलिखित 2 फील्डसेटमैपर कार्यान्वयन वर्ग बनाए हैं:
@Component("paymentBatchFieldSetMapper")
public class PaymentBatchFieldSetMapper implements FieldSetMapper<PaymentBatch> {
@Override
public PaymentBatch mapFieldSet(FieldSet fieldSet) throws BindException {
// TODO Auto-generated method stub
return null;
}
}
और दूसरा एक के रूप में,
@Component("reversalBatchFieldSetMapper")
public class ReversalBatchFieldSetMapper implements FieldSetMapper<PaymentBatch> {
@Override
public PaymentBatch mapFieldSet(FieldSet fieldSet) throws BindException {
// TODO Auto-generated method stub
return null;
}
}
मैंने उपरोक्त 2 में से किसी एक को नीचे के रूप में वापस करने के लिए निम्नलिखित के रूप में एक कारखाना वर्ग बनाया है
@Component("achBatchFieldSetMapperFactory")
public class ACHBatchFieldSetMapperFactory {
@Autowired
private ApplicationContext applicationContext;
public FieldSetMapper<? extends AbstractACHBatch> getFieldSetMapper(RecordTypeDescription recordTypeDescription) {
FieldSetMapper<? extends AbstractACHBatch> fieldSetMapper = null;
switch(recordTypeDescription) {
case PAYMENT:
fieldSetMapper = applicationContext.getBean(PaymentBatchFieldSetMapper.class);
break;
case REVERSAL:
fieldSetMapper = applicationContext.getBean(ReversalBatchFieldSetMapper.class);
break;
}
return fieldSetMapper;
}
}
नीचे मैप ऑब्जेक्ट के लिए सेम कॉन्फ़िगरेशन है जिसे PatternMatchingCompositeLineMapper में इंजेक्ट किया जाना है।
@Bean
public Map<String, LineTokenizer> fieldSetMapperMap(FileHeaderFieldSetMapper fileHeaderFieldSetMapper, PaymentBatchFieldSetMapper paymentBatchFieldSetMapper,
ReversalBatchFieldSetMapper reversalBatchFieldSetMapper) {
Map<String, FieldSetMapper> map = new HashMap<String, FieldSetMapper>();
map.put("1*", fileHeaderFieldSetMapper);
map.put("5*", ?????);
}
क्या कोई संभावना है कि मैं फ़ाइल में रिकॉर्ड के आधार पर आवश्यक फील्डसेट मैपर को वापस करने के लिए कारखाने का उपयोग कर सकता हूं?
1 उत्तर
आइटम रीडर को एक बार में एक प्रकार की वस्तुओं को वापस करने के लिए डिज़ाइन किया गया है। आइए कल्पना करें कि हम RecordCode
फ़ील्ड के अनुसार रिकॉर्ड्स को PaymentBatch
या ReversalBatch
में मैप करने का प्रबंधन करते हैं, इसका मतलब है कि मैपिंग होने के बाद, ItemReader
दो प्रकार लौटाएगा। यह डिजाइन द्वारा संभव नहीं है।
आप क्या कर सकते हैं एक पीओजेओ बनाएं जिसमें आपकी इनपुट फ़ाइल में फ़ील्ड के साथ एक-से-एक मैपिंग हो, फिर प्रत्येक आइटम को उसके प्रकार के अनुसार संसाधित करने के लिए ClassifierCompositeItemProcessor
का उपयोग करें (वर्गीकरण पर आधारित होगा ClassifierCompositeItemProcessor
RecordTypeDescription
एनम आपके मामले में)।
NB: तकनीकी रूप से सामान्य प्रकार के ItemReader<T>
इंटरफ़ेस के बारे में भूलना और आइटम रीडर को Object
s वापस करना तकनीकी रूप से संभव है, लेकिन इसके लिए Object
s के बदसूरत उपयोग की आवश्यकता होगी। instanceof
रिकॉर्ड प्रकार निर्धारित करने के लिए आपके प्रोसेसर में। मैं इस दृष्टिकोण का उपयोग करने की अत्यधिक अनुशंसा करता हूं नहीं।
संबंधित सवाल
नए सवाल
spring-batch
स्प्रिंग बैच एक हल्का, व्यापक ढांचा है जिसका उद्देश्य उद्यम प्रणालियों के दैनिक संचालन के लिए महत्वपूर्ण बैच अनुप्रयोगों के विकास को सक्षम करना है। इस संदर्भ में बैच एप्लिकेशन बल्क डेटा प्रोसेसिंग की ओर लक्षित स्वचालित ऑफ़लाइन प्रणालियों को संदर्भित करता है।