在春季批量itemReader

时间:2015-10-22 21:28:43

标签: spring-batch

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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

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

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

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

private byte[] stream;

@Override
public void beforeStep(StepExecution stepExecution) {

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

}

3)覆盖setResource方法以将此stream作为实际资源传递。

@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中,并使用beforeStep的{​​{1}}方法获取它