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

时间:2015-11-20 10:13:41

标签: spring spring-batch

我的要求是针对不同的格式文件(PSV和CSV)轮询两个不同的目录,并使用弹簧批处理它。

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

e.g。如果它是psv - 调用PSV读卡器,PSV线路映射器 如果是csv - 调用CSVReader,CSV行映射器

任何帮助都将不胜感激。

由于

3 个答案:

答案 0 :(得分:1)

您可以创建自己的ReaderCustomFilesReader

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();
    }
}

注册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>

自定义ItemProcessor和自定义ItemWriter可以完成相同的操作。

答案 1 :(得分:1)

感谢您的所有建议。

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

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

由于

答案 2 :(得分:0)

另一种方法是创建一个类似于ClassifierCompositeItemProcessorClassifierCompositeItemWriter的类。也就是说,它需要一个Classifier,一个委派的ItemReader列表,并根据ItemReader的结果选择正确的Classifier

问题是,您没有输入进行分类,因为尚未完成读取。这就是我考虑使用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;
    }

}

现在如何使用它。首先,您需要MultiResourceItemReader同时读取.PSV和.CSV。然后,您必须将读取委托给ResourceClassifierCompositeItemReader。您必须添加BackToBackPatternClassifier来对字符串resource.getFilename()进行分类(即文件名)并相应地调用ItemReader(通过MatcherMap)。为此,您需要编写自己的RouterDelegate(获取文件名,将其拆分以获取扩展名,并将其作为要匹配的字符串返回)。