Fab*_*bio 10 java spring batch-processing spring-batch itemprocessor
我正在编写一个Spring批处理作业,在我的一个步骤中,我有以下处理器代码:
@Component
public class SubscriberProcessor implements ItemProcessor<NewsletterSubscriber, Account>, InitializingBean {
@Autowired
private AccountService service;
@Override public Account process(NewsletterSubscriber item) throws Exception {
if (!Strings.isNullOrEmpty(item.getId())) {
return service.getAccount(item.getId());
}
// search with email address
List<Account> accounts = service.findByEmail(item.getEmail());
checkState(accounts.size() <= 1, "Found more than one account with email %s", item.getEmail());
return accounts.isEmpty() ? null : accounts.get(0);
}
@Override public void afterPropertiesSet() throws Exception {
Assert.notNull(service, "account service must be set");
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码工作,但我发现,有些情况下有一个以上的一些优势情况下Account
每个NewsletterSubscriber
被允许的.所以我需要删除状态检查并将多个传递Account
给项目编写者.
我找到的一个解决方案是更改两者ItemProcessor
并ItemWriter
处理List<Account>
类型而不是,Account
但这有两个缺点:
Account
是,可以在同一个事务中写入多个对象,因为给写入者的列表可能包含多个帐户,我想避免这种情况.有没有办法,可能使用一个监听器,或者更换一些弹簧批处理使用的内部组件以避免处理器中的列表?
我正在研究isComplete和getAdjustedOutputs方法,FaultTolerantChunkProcessor
其中标记为扩展点,SimpleChunkProcessor
以查看是否可以以某种方式使用它们来实现我的目标.
任何提示都是受欢迎的.
Mat*_*uis 10
Item Processor接受一件事,并返回一个列表
MyItemProcessor implements ItemProcessor<SingleThing,List<ExtractedThingFromSingleThing>> {
public List<ExtractedThingFromSingleThing> process(SingleThing thing) {
//parse and convert to list
}
}
Run Code Online (Sandbox Code Playgroud)
将下游作者包裹起来以解决问题.这样,这个编写器下游的东西不必使用列表.
@StepScope
public class ItemListWriter<T> implements ItemWriter<List<T>> {
private ItemWriter<T> wrapped;
public ItemListWriter(ItemWriter<T> wrapped) {
this.wrapped = wrapped;
}
@Override
public void write(List<? extends List<T>> items) throws Exception {
for (List<T> subList : items) {
wrapped.write(subList);
}
}
}
Run Code Online (Sandbox Code Playgroud)
没有一种方法可以ItemProcessor
在不深入杂草的情况下每次调用返回一个以上的项目到Spring Batch 中。如果你真的想知道 anItemProcessor
和ItemWriter
exit的关系在哪里(不推荐),看看ChunkProcessor
接口的实现。虽然简单的情况 ( SimpleChunkProcessor
) 并没有那么糟糕,但如果您使用任何容错逻辑(通过 跳过/重试FaultTolerantChunkProcessor
),它会变得非常笨拙。
一个更简单的选择是ItemReader
在返回项目之前将此逻辑移至执行此扩充的 。将ItemReader
您正在使用的任何内容包装在一个自定义ItemReader
实现中,该实现在返回项目之前执行服务查找。在这种情况下,不是NewsletterSubscriber
从读取器返回 a,而是Account
根据先前的信息返回 a 。
归档时间: |
|
查看次数: |
16686 次 |
最近记录: |