Java 如何在SpringBatch中从两个不同的文件夹读取多个xml文件?
我有多个文件要从两个具有相同父路径的不同目录读取和写入。 如果“org.springframework.batch.item.file.MultiResourceItemReader”中的某个目录没有要读取的文件,是否可以选择该目录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
<!-- 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;
}