Spring Batch-将ItemWriter与列表列表一起使用
我们的处理器将一个List<?>
(有效地传递List<List<?>>
)返回给我们ItemWriter
。
现在,我们观察到JdbcBatchItemWriter
尚未编程处理item instanceof
List。我们还观察到处理instanceInstanceof
List
;我们需要编写一个自定义ItemSqlParameterSourceProvider
。
但可悲的是,它返回时SqlParameterSource
只能处理一个item
,又不能处理a List
。
因此,有人可以帮助我们了解如何处理中的列表JdbcBatchItemWriter
吗?
回答:
通常,设计模式为:
Reader -> reads something, returns ReadItemProcessor -> 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