我在我的应用程序中使用了Spring Batch。我有很多已经编写好的ItemReader、ItemWriter和一个复合ItemProcessor,它们允许我构建一个包含块步骤的作业。所有组件共享同一个域对象"Product"。
public class CustomReader implements ItemReader<Product> {
@Override
public Product read() throws Exception {
//business logic for reading a products
return null;
}
}
public class CustomWriter implements ItemWriter<Product> {
@Override
public void write(List<? extends Product> items) throws Exception {
//business logic for writing a products
}
}
public class CustomProcessor extends ItemProcessor<Product, Product> {
@Override
public Product process(Product product) throws Exception {
//custom logic for data processing
return null;
}
}
目前,我需要有一个可能性来使用一个新的ItemProcessor,它将发送一个http请求。然而,从Processor的Angular 来看,我只能访问单个Product对象,而不是为单个产品发送一个http请求。我需要收集10个产品(获取他们的id)并执行一个批处理请求。然后我需要Map响应并将多个产品返回给ItemWriter。
public class CustomHttpProcessor extends ItemProcessor<Product, Product> {
@Override
public List<Product> process(List<Product> product) throws Exception {
//custom logic for sending a batch requests via http
return null;
}
}
除了在代码库中的任何地方将基域对象从Product更改为List之外,还有其他选择吗(我有一种感觉,这将显著降低整个应用程序的性能,并使内存使用量激增?)还有其他Spring Batch的特性可以使用吗?
提前感谢您的帮助!
1条答案
按热度按时间xriantvc1#
您可以使用
ItemWriteListener#beforeWrite(Chunk<Product> products)
来实现这一点,这个回调函数允许您在块或项被写入之前访问它们,因此您可以在此时执行REST批处理请求,并在write
操作之前根据需要转换它们。