如何使用spring批处理不同格式的文件?

如何使用spring批处理不同格式的文件?,spring,spring-batch,Spring,Spring Batch,我的要求是为不同格式的文件(PSV和CSV)轮询两个不同的目录,并使用SpringBatch进行处理 我使用入站通道适配器轮询目录。但是,我无法找到根据文件类型调用相应读取器及其标记器和字段映射器的方法 e、 g.如果是psv-呼叫psv读卡器、psv测线器 如果是csv-请调用CSVReader、csv行映射器 任何帮助都将不胜感激 谢谢您可以创建自己的阅读器:自定义文件阅读器: public class CustomFilesReader implements InitializingBea

我的要求是为不同格式的文件(PSV和CSV)轮询两个不同的目录,并使用SpringBatch进行处理

我使用入站通道适配器轮询目录。但是,我无法找到根据文件类型调用相应读取器及其标记器和字段映射器的方法

e、 g.如果是psv-呼叫psv读卡器、psv测线器 如果是csv-请调用CSVReader、csv行映射器

任何帮助都将不胜感激


谢谢

您可以创建自己的
阅读器
自定义文件阅读器

public class CustomFilesReader implements InitializingBean{

    private List<File> yourFiles= null;

    public File read() {
        if ((yourFiles!= null) && (yourFiles.size() != 0)) {  
          return yourFiles.remove(0);
        }
        return null;
    }

    //Reading Items from your dir
    private void loadItems() {
        this.yourFiles= new ArrayList<File>();
       // populate the items
     }


    @Override
    public void afterPropertiesSet() throws Exception {
        loadItems();
    }
}
公共类CustomFileReader实现初始化bean{
私有列表文件=null;
公共文件读取(){
如果((yourFiles!=null)&&(yourFiles.size()!=0)){
返回您的文件。删除(0);
}
返回null;
}
//从目录中读取项目
私有void loadItems(){
this.yourFiles=newarraylist();
//填充项目
}
@凌驾
public void afterPropertieSet()引发异常{
loadItems();
}
}
注册bean:

<bean id="customFilesReader " class="mypackage.CustomFilesReader "/>


<bean id="myReader"
    class="org.springframework.batch.item.adapter.ItemReaderAdapter">
    <property name="targetObject" ref="customFilesReader " />
    <property name="targetMethod" value="read" />
</bean>


对于自定义
项目处理器
和自定义
项目编写器
也可以做同样的事情。另一种方法是创建类似于
分类组件处理器
分类组件编写器
的类。也就是说,它需要一个
分类器
,一个委托的
项目读取器
列表,并根据
分类器
的结果选择正确的
项目读取器

问题是,您没有要分类的输入,因为读取尚未完成。这就是为什么我考虑使用
resource
属性作为元素进行分类。结果如下:

public class ResourceClassifierCompositeItemReader<T> implements ItemReader<T> {

    private Classifier<String, ItemReader<? extends T>> classifier = new ClassifierSupport<String, ItemReader<? extends T>> (null);
    private Resource resource;

    public void setClassifier(Classifier<String, ItemReader<? extends T>> classifier) {
        this.classifier = classifier;
    }

    @Override
    public T read() throws Exception, UnexpectedInputException, ParseException {
        return readItem(classifier.classify(resource.getFilename()));
    }

    private T readItem(ItemReader<? extends T> reader) throws Exception {
        return reader.read();
    }

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

}
公共类ResourceClassifierCompositeItemReader实现ItemReader{

私人分类器谢谢你的建议

我采用了一种不同的方法。我已将项读取器和写入器设置为作业参数。因此,根据文件类型,将调用相应的项读取器和写入器

<chunk reader= "#{JobParameter[bean.reader]}" writer="#{JobParameter[bean.writer]}"/>


谢谢

解决方案是创建您自己的读卡器,并基于文件扩展检查应用相应的逻辑