Unser Prozessor gibt eine Liste (effektiv eine List<List<?>>
) an unsere ItemWriter
zurück. Nun haben wir festgestellt, dass die JdbcBatchItemWriter
nicht programmiert ist, um Item Instanceof List zu behandeln. Wir haben auch beobachtet, Artikelinstanz von List
zu verarbeiten; wir müssen eine benutzerdefinierte ItemSqlParameterSourceProvider
schreiben. Aber der traurige Teil ist, dass es SqlParameterSource
zurückgibt, das nur ein Objekt behandeln kann und wieder nicht in der Lage ist, eine Liste zu behandeln. Also, kann uns jemand helfen, zu verstehen, wie man die Liste der Listen im JdbcBatchItemWriter
behandelt.Verwenden eines ItemWriter mit einer Liste von Listen
1
A
Antwort
6
Typischerweise ist das Entwurfsmuster ist:
Reader -> reads something, returns ReadItem
Processor -> ingests ReadItem, returns ProcessedItem
Writer -> ingests List<ProcessedItem>
Wenn Ihr Prozessor List<Object>
zurückkehren, dann müssen Sie Ihre Writer List<List<Object>>
zu erwarten.
Sie dies durch Umwickeln tun könnte Ihre JdbcBatchItemWriter
als Delegierter in einer ItemWriter, die etwa wie folgt aussehen:
public class ListUnpackingItemWriter<T> implements ItemWriter<List<T>>, ItemStream, InitializingBean {
private ItemWriter<T> delegate;
@Override
public void write(final List<? extends List<T>> lists) throws Exception {
final List<T> consolidatedList = new ArrayList<>();
for (final List<T> list : lists) {
consolidatedList.addAll(list);
}
delegate.write(consolidatedList);
}
@Override
public void afterPropertiesSet() {
Assert.notNull(delegate, "You must set a delegate!");
}
@Override
public void open(ExecutionContext executionContext) {
if (delegate instanceof ItemStream) {
((ItemStream) delegate).open(executionContext);
}
}
@Override
public void update(ExecutionContext executionContext) {
if (delegate instanceof ItemStream) {
((ItemStream) delegate).update(executionContext);
}
}
@Override
public void close() {
if (delegate instanceof ItemStream) {
((ItemStream) delegate).close();
}
}
public void setDelegate(ItemWriter<T> delegate) {
this.delegate = delegate;
}
}
Hervorragende Lösung vorgeschlagen. Wir planten, etwas Komplexeres zu tun, indem wir http://forum.spring.io/forum/spring-projects/batch/122284-how-to-write-a-list-of-items-with-a-itemwriter implementieren; aber Ihre Lösung ist generisch genug. In letzterem würden wir viel Arbeit benötigen. Das Testen würde ebenfalls umständlich werden. – chatanyday
Sehr gute Formatierung des Codes, haben Sie eine Vorlage dafür? – Serge
Es kann effizienter sein, eine Liste zu erstellen und einen Schreiber einmal auszuführen. – Serge