Spring batch 在spring batch itemReader中读取流而不是文件

Spring batch 在spring batch itemReader中读取流而不是文件,spring-batch,Spring Batch,我得到一个csv文件作为一个webservice调用,需要修改。现在我把它保存在temp目录中,作为setResource提供给读者 有没有办法按原样提供流(字节[])而不是先保存文件?ItemReader的方法setResource将org.springframework.core.io.Resource作为参数。这个类有一些现成的实现,您可以在其中找到org.springframework.core.io.InputStreamResource。这个类的构造函数采用java.io.Input

我得到一个csv文件作为一个webservice调用,需要修改。现在我把它保存在temp目录中,作为setResource提供给读者


有没有办法按原样提供流(字节[])而不是先保存文件?

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 {
}
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().getExecutionContext().get(“key”)在
beforeStep
方法中获取它即可

在通过作业启动器启动作业时,是否有一种类似于传递作业参数的方法来传递流?我有一个单独的获取文件的服务,然后我想启动批处理作业来加载它。@explorer不幸的是,
JobParameters
只能传递
String
Long
Date
Double
类型。根据这篇文章:,你要么使用外部存储(保存你的文件),要么声明一个可以访问它的bean。谢谢@Thrax。我也注意到了这一点,并且正在寻找一些看起来很棘手的工作。。。
@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);
}