Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringBatch中从两个不同的文件夹读取多个xml文件?_Java_Spring Batch_Spritebatch - Fatal编程技术网

Java 如何在SpringBatch中从两个不同的文件夹读取多个xml文件?

Java 如何在SpringBatch中从两个不同的文件夹读取多个xml文件?,java,spring-batch,spritebatch,Java,Spring Batch,Spritebatch,我有多个文件要从两个具有相同父路径的不同目录读取和写入。 如果“org.springframework.batch.item.file.MultiResourceItemReader”中的某个目录没有要读取的文件,是否可以选择该目录 <!-- multi xml reader --> <bean id="multiResourceReader" class="org.springframework.batch.item.file.MultiResourceItemRea

我有多个文件要从两个具有相同父路径的不同目录读取和写入。 如果“org.springframework.batch.item.file.MultiResourceItemReader”中的某个目录没有要读取的文件,是否可以选择该目录

<!-- multi xml reader -->
    <bean id="multiResourceReader" class="org.springframework.batch.item.file.MultiResourceItemReader">
        <property name="resources" ref="vinFeedFileResouce" />
        <property name="delegate" ref="vinFeedReader" />
    </bean>

    <bean id="vinFeedFileResouce" class="org.springframework.core.io.FileSystemResource"    scope="step">
        <constructor-arg>
            <list>
                <ref bean="read_ONE" />
                <ref bean="read_TWO" />
            </list>
        </constructor-arg>
    </bean>

    <bean id="read_ONE" class="org.springframework.core.io.FileSystemResource"  scope="step">
        <constructor-arg value="#{path_ONE}"></constructor-arg>
    </bean>

    <bean id="read_TWO" class="org.springframework.core.io.FileSystemResource"  scope="step">
        <constructor-arg value="#{path_TWO}"></constructor-arg>
    </bean>

如果您看到
FileSystemResource
的源代码,您会发现构造函数可以使用文件或字符串,而不是文件或字符串列表。您可以编写自定义资源读取器从多个目录中读取文件。这里有一个例子

    <bean id="multiResourceReader" class="org.springframework.batch.item.file.MultiResourceItemReader">
        <property name="resources" value="#{myResourceReader.read()}" />
        <property name="delegate" ref="vinFeedReader" />
    </bean>

    <bean id="myResourceReader" class="com.kp.swasthik.MyResourceReader">
        <property name="resource" value="file:///path1/*.txt, file:///path2/*.txt"></property>
    </bean>

ResourceReader类

public class MyResourceReader {

    private String resource;

    public String getResource() {
        return resource;
    }

    public void setResource(String resource) {
        this.resource = resource;
    }

    public Resource[] read(){

        List<Resource> resources = new ArrayList<>();
        if(resource == null || resource.isEmpty()){
            return new Resource[]{};
        }
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Arrays.stream(resource.split(",")).forEach(v->{
            try {
                Collections.addAll(resources, resolver.getResources(v));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        });
        return resources.toArray(new Resource[0]);
    }

}
公共类MyResourceReader{
私有字符串资源;
公共字符串getResource(){
返回资源;
}
公共void集合资源(字符串资源){
这个资源=资源;
}
公共资源[]读取(){
List resources=new ArrayList();
if(resource==null | | resource.isEmpty()){
返回新资源[]{};
}
PathMatchIngressourcepatternResolver=新的PathMatchIngressourcepatternResolver();
Arrays.stream(resource.split(“,”).forEach(v->{
试一试{
Collections.addAll(resources,resolver.getResources(v));
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
});
返回resources.toArray(新资源[0]);
}
}

切换到基于注释的配置。在那里,您可以将所有资源(来自不同目录)添加到阅读器:

@Bean
public ItemReader<?> reader() {
   Resource[] res = ... //get eg using PathMatchingResourcePatternResolver multiple times on different dirs

   MultiResourceItemReader<?> r = new MultiResourceItemReader<>();
   r.setResources(res);
   return r;
}
@Bean
公共项目阅读器(){
Resource[]res=…//在不同的目录上多次使用PathMatchingResourcePatternResolver获取eg
MultiResourceItemReader r=新的MultiResourceItemReader();
r、 资源组;
返回r;
}
@Bean
public ItemReader<?> reader() {
   Resource[] res = ... //get eg using PathMatchingResourcePatternResolver multiple times on different dirs

   MultiResourceItemReader<?> r = new MultiResourceItemReader<>();
   r.setResources(res);
   return r;
}