Spring Batch-将ItemWriter与列表列表一起使用

我们的处理器将一个List<?>(有效地传递List<List<?>>)返回给我们ItemWriter

现在,我们观察到JdbcBatchItemWriter尚未编程处理item instanceof

List。我们还观察到处理instanceInstanceof

List;我们需要编写一个自定义ItemSqlParameterSourceProvider

但可悲的是,它返回时SqlParameterSource只能处理一个item,又不能处理a List

因此,有人可以帮助我们了解如何处理中的列表JdbcBatchItemWriter吗?

回答:

通常,设计模式为:

Reader -> reads something, returns ReadItem

Processor -> ingests ReadItem, returns ProcessedItem

Writer -> ingests List<ProcessedItem>

如果处理器返回List<Object>,则需要Writer期望List<List<Object>>

您可以通过将您JdbcBatchItemWriter的委托包装在看起来像这样的ItemWriter中来实现:

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;

}

}

以上是 Spring Batch-将ItemWriter与列表列表一起使用 的全部内容, 来源链接: utcz.com/qa/414647.html

回到顶部