Запись в две разные таблицы путем упаковки данных из Processor Spring Batch

У меня есть требование, когда мне нужно заполнить две разные таблицы, используя два разных объекта. Я упаковываю (List и List) в объект CustEmp, но я не могу понять, как использовать CompositeItemWriter для его записи с использованием отдельных источников данных. Пожалуйста помоги

Я обновил код, к сожалению, по некоторым причинам я не могу загрузить точный код. Пожалуйста, дайте мне знать, если вам не ясно. Я нашел здесь аналогичный вопрос, но не смог понять, как развернуть часть в писателе: используйте Spring Batch для записи в разные источники данных

RecordsDomain.java

public class RecordsDomain{
private List<XYRecords> xyRecords;
private YZRecords yzRecords;

//getters & setters

}

ProcessorDomain.java - НА ОСНОВЕ НОВЫХ ТРЕБОВАНИЙ

    @Configuration
 public class DomainProcessor implements ItemProcessor<InputDomain, RecordsDomain> {

    
    @Override
    public DomainProcessor process(InputDomain input) throws Exception {
        RecordsDomain allRecords = new RecordsDomain();
        //Processing logic- listXyRecords is of type List<XYRecords> 
         and yxRecords is of type YXRecords, I am setting both in 
        RecordsDomain//
        dtrRecords.setXyRecords(listXyRecords);
        dtrRecords.setYzRecords(yzRecords);
         return dtrRecords;
    }

}

DomainWriter.java

@Configuration
public class DomainWriter {
 //CURRENTLY I have a Writer which unpacks and inserts/update a table based off List<XYRecords>. I need to add another writer which updates based off YZRecords. How do i go about that.//
    @Autowired
    DataSource dataSource;
    public ItemWriter<List<XYRecords>> writer() throws Exception {
        ListUnpackingItemWriter<XYRecords> listUnpackingItemWriter = new ListUnpackingItemWriter<>();
        listUnpackingItemWriter.setDelegate(itemWriter());
        return listUnpackingItemWriter;
    }
 

    public CompositeItemWriter<XYRecords> itemWriter() throws Exception {
            CompositeItemWriter<XYRecords> itemWriter = new CompositeItemWriter<>();
            ClassifierCompositeItemWriter<XYRecords> classifierCompositeItemWriter = getDataItemWriters(
                    insertItemWriter(), updateItemWriter());        
            itemWriter.setDelegates(Arrays.asList(classifierCompositeItemWriter));
            itemWriter.afterPropertiesSet();
            return itemWriter;
        }

    public JdbcBatchItemWriter<XYRecords> insertItemWriter() {
            JdbcBatchItemWriter<XYRecords> itemWriter = new JdbcBatchItemWriter<>();
            itemWriter.setDataSource(dataSource);
            itemWriter.setAssertUpdates(false);
            itemWriter.setSql("INSERT QUERY");
            ItemPreparedStatementSetter<XYRecords> setterStatus = new InsertPreparedStatementSetter();
            itemWriter.setItemPreparedStatementSetter(setterStatus);
            return itemWriter;
        }
    
    public JdbcBatchItemWriter<XYRecords> updateItemWriter() {
            JdbcBatchItemWriter<XYRecords> itemWriter = new JdbcBatchItemWriter<>();
            itemWriter.setDataSource(dataSource);
            itemWriter.setAssertUpdates(false);
            itemWriter.setSql("UPDATE QUERY");
            ItemPreparedStatementSetter<XYRecords> setterStatus = new UpdatePreparedStatementSetter();
            itemWriter.setItemPreparedStatementSetter(setterStatus);
            return itemWriter;
        }
    private ClassifierCompositeItemWriter<XYRecords> getDataItemWriters(
                ItemWriter<XYRecords> insertItemWriter,
                ItemWriter<XYRecords> updateItemWriter) {
            ClassifierCompositeItemWriter<XYRecords> classifierCompositeItemWriter = new ClassifierCompositeItemWriter<>();
            classifierCompositeItemWriter
                    .setClassifier((Classifier<XYRecords, ItemWriter<? super XYRecords>>) XYRecords-> {
                        if ("Check if qualifies to update the table") {
                            return updateItemWriter;
    
                        } else {
                            CompositeItemWriter<XYRecords> compositeItemWriter=new CompositeItemWriter<>();
                            compositeItemWriter.setDelegates(Arrays.asList(insertItemWriter,updateItemWriter));
                            return compositeItemWriter;
                        }
    
                    });
            return classifierCompositeItemWriter;
        }

}

1 ответ

Здесь вы возвращаете составной элемент записи для случая "вставки":

private ClassifierCompositeItemWriter<XYRecords> getDataItemWriters(
            ItemWriter<XYRecords> insertItemWriter,
            ItemWriter<XYRecords> updateItemWriter) {
        ClassifierCompositeItemWriter<XYRecords> classifierCompositeItemWriter = new ClassifierCompositeItemWriter<>();
        classifierCompositeItemWriter
                .setClassifier((Classifier<XYRecords, ItemWriter<? super XYRecords>>) XYRecords-> {
                    if ("Check if qualifies to update the table") {
                        return updateItemWriter;

                    } else {
                        CompositeItemWriter<XYRecords> compositeItemWriter=new CompositeItemWriter<>();
                        compositeItemWriter.setDelegates(Arrays.asList(insertItemWriter,updateItemWriter));
                        return compositeItemWriter;
                    }

                });
        return classifierCompositeItemWriter;
    }

Я думаю, это должно быть примерно так:

private ClassifierCompositeItemWriter<XYRecords> getDataItemWriters(
            ItemWriter<XYRecords> insertItemWriter,
            ItemWriter<XYRecords> updateItemWriter) {
        ClassifierCompositeItemWriter<XYRecords> classifierCompositeItemWriter = new ClassifierCompositeItemWriter<>();
        classifierCompositeItemWriter
                .setClassifier((Classifier<XYRecords, ItemWriter<? super XYRecords>>) XYRecords-> {
                    if ("Check if qualifies to update the table") {
                        return updateItemWriter;

                    } else { // insert case
                        return insertItemWriter;;
                    }

                });
        return classifierCompositeItemWriter;
    }
Другие вопросы по тегам