Запись в две разные таблицы путем упаковки данных из 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;
}