当前位置: 首页 > 知识库问答 >
问题:

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

齐振
2023-03-14

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

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

例如,如果它是psv-调用PSV阅读器,如果它是csv-调用CSVReader,CSV线路映射器

任何帮助都将不胜感激。

谢谢

共有3个答案

巫马自明
2023-03-14

另一种方法是创建类似于ClassifierCompositeItemProcessor或ClassifierCompositeItemWriter的类。也就是说,它需要一个分类器、一个委托的项目读取器列表,并根据分类器的结果选择正确的项目读取器。

问题是,您没有要分类的输入,因为读取尚未完成。这就是为什么我考虑使用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。然后您必须将读取委托给Resource分类器CompositeItemReader。您必须添加一个BackToBackPatternfier来分类字符串resource.getFilename()(即文件名)并相应地调用ItemReader(通过MatcherMap)。为此,您需要编写自己的RouterServer ate(获取文件名,拆分它以获取扩展名,并将其作为要匹配的字符串返回)。

柯良骏
2023-03-14

谢谢你的建议。

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

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

谢谢

於英朗
2023-03-14

您可以创建自己的读取器:

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>

对于自定义项目处理器和自定义项目编写器,也可以执行相同的操作。

 类似资料:
  • 目前我们看到的输入文件都只包含一种语言,但在实际应用中我们会遇到有些包含多种语言的常用文件格式。例如,Java的文档注释,XML文件等。这些环绕着模板表达式的文本需要不同的处理方式,它们被称为孤岛语言。 ANTLR有提供一个称之为“词法模型”的词法分析器特性,它让我们可以很容易地处理包含混合格式的文件。基本思路是:当词法分析器看到特殊的哨兵字符序列时,让它在模式之间来回切换。 XML是一个很好例子

  • 我想使用不同的模式来保存Spring批处理表。我可以在<code>JobRepositoryFactoryBean<code>中看到我的新数据源。但这些表仍然是在另一个shcema中创建的,在那里我有业务表。我在这里读到了可以使用<code>数据源的soemwhere。setValidationQuery来更改模式,但仍然不起作用。我能解决这个问题。下面是<code>JobRepositoryFa

  • 我正在使用spring批处理入站文件,下面是我的用例 将收到包含15个CSV格式文件的zip 我需要并行处理它们 在处理完所有文件后,需要进行一些计算并发送报告 有人能建议我如何使用Spring Batch实现这一点吗?

  • 我有一个Spring批导入流程,它有以下步骤: 读取特定格式的文件 保存人员、属性和约会的数据(每个文件行可以表示对多个表进行多次插入) 写入结果文件(主要是读取的结果,但有时我们无法将读取的数据处理成可以连贯插入的内容) 我目前在一组阅读器中有#1(每个文件格式一个),在单个Writer类中有#2和#3。我感觉写入结果文件应该是与将数据写入数据库分开的一个步骤,但我不确定如何做到这一点。 ste

  • 我知道匹配模式解析器,这是Spring批处理提供的。我需要关于如何构造批处理作业的帮助,以便它可以读取循环中的记录类型5和记录类型6。

  • 我的应用程序中有一个连接到Oracle数据库的数据源。是否可以通过此数据源访问另一个包含Spring批处理元数据表的模式?此数据源的用户拥有访问其他架构的所有权限。 我已经尝试过JobRepository的“tablePrefix”属性,例如“Schema.batch\u0”。但它不起作用。简单地说,我搜索告诉Spring批处理访问元数据表的方法,如“select….from Schema.bat