spring-batch – 从spring批量itemReader中的流而不是文件中读取

我得到一个csv文件作为webservice调用,需要加密.现在我将它保存在临时目录中,以将其作为setResource提供给Reader.

有没有办法提供流(byte [])而不是先保存文件?

ItemReader的setResource方法将org. springframework.core.io.Resource作为参数.这个类有一些开箱即用的实现,其中你可以找到org.springframework.core.io.InputStreamResource.这个类的构造函数接受 java.io.InputStream,它可以由java.io.ByteArrayInputStream实现.

所以从技术上讲,是的,你可以在ItemReader中使用byte []参数.

现在,关于如何实际做到这一点,这里有一些想法:

1)创建自己的FlatFileItemReader(因为CSV是一个平面文件)并使其实现StepExecutionListener

public class CustomFlatFileItemReader<T> extends FlatFileItemReader<T> implements StepExecutionListener {
}

2)覆盖beforeStep方法,在其中进行webservice调用并将结果保存在变量中

private byte[] stream;

@Override
public void beforeStep(StepExecution stepExecution) {

     // your webservice logic
     stream = yourWebservice.results();

}

3)重写setResource方法以将此流作为实际资源传递.

@Override
public void setResource(Resource resource) {

    // Convert byte array to input stream
    InputStream is = new ByteArrayInputStream(stream);

    // Create springbatch input stream resource
    InputStreamResource res = new InputStreamResource(is);

    // Set resource
    super.setResource(res);
}

此外,如果您不想在ItemReader中调用您的Web服务,您可以简单地将字节数组存储在JobExecutionContext中,并使用stepExecution.getJobExecution()在getStep方法中获取它.getExecutionContext().get(“key”) ;

相关文章
相关标签/搜索