मैं एक स्प्रिंग बैच नौकरी स्थापित कर रहा हूं जो एक बहु-रिकॉर्ड फ़ाइल को संसाधित करेगा। रिकॉर्ड में से एक में निम्नलिखित संरचना है।

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*", ?????);                   
}

क्या कोई संभावना है कि मैं फ़ाइल में रिकॉर्ड के आधार पर आवश्यक फील्डसेट मैपर को वापस करने के लिए कारखाने का उपयोग कर सकता हूं?

2
AbNig 4 नवम्बर 2018, 22:37

1 उत्तर

सबसे बढ़िया उत्तर

आइटम रीडर को एक बार में एक प्रकार की वस्तुओं को वापस करने के लिए डिज़ाइन किया गया है। आइए कल्पना करें कि हम RecordCode फ़ील्ड के अनुसार रिकॉर्ड्स को PaymentBatch या ReversalBatch में मैप करने का प्रबंधन करते हैं, इसका मतलब है कि मैपिंग होने के बाद, ItemReader दो प्रकार लौटाएगा। यह डिजाइन द्वारा संभव नहीं है।

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

NB: तकनीकी रूप से सामान्य प्रकार के ItemReader<T> इंटरफ़ेस के बारे में भूलना और आइटम रीडर को Objects वापस करना तकनीकी रूप से संभव है, लेकिन इसके लिए Objects के बदसूरत उपयोग की आवश्यकता होगी। instanceof रिकॉर्ड प्रकार निर्धारित करने के लिए आपके प्रोसेसर में। मैं इस दृष्टिकोण का उपयोग करने की अत्यधिक अनुशंसा करता हूं नहीं

1
Mahmoud Ben Hassine 5 नवम्बर 2018, 07:48