java 如何在ItemProcessor级别处理对象缓冲

hiz5n14c  于 2023-03-06  发布在  Java
关注(0)|答案(1)|浏览(101)

我在我的应用程序中使用了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的特性可以使用吗?
提前感谢您的帮助!

xriantvc

xriantvc1#

您可以使用ItemWriteListener#beforeWrite(Chunk<Product> products)来实现这一点,这个回调函数允许您在块或项被写入之前访问它们,因此您可以在此时执行REST批处理请求,并在write操作之前根据需要转换它们。

相关问题