gpt4 book ai didi

java - Spring Batch - 使用带有列表列表的 ItemWriter

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:09 25 4
gpt4 key购买 nike

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

现在,我们观察到 JdbcBatchItemWriter未编程处理 item instanceof List .我们还观察到处理项目 instanceof List ;我们需要写一个自定义 ItemSqlParameterSourceProvider .

但可悲的是它返回 SqlParameterSource只能处理一个 item再次无法处理 List .

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

最佳答案

通常,设计模式是:

Reader -> reads something, returns ReadItem
Processor -> ingests ReadItem, returns ProcessedItem
Writer -> ingests List<ProcessedItem>

如果您的处理器返回 List<Object> ,那么您需要您的 Writer 期望 List<List<Object>> .

你可以通过包装你的 JdbcBatchItemWriter 来做到这一点作为 ItemWriter 中的委托(delegate),看起来像这样:

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;
}

}

关于java - Spring Batch - 使用带有列表列表的 ItemWriter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37866312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com