【问题标题】:How to process files of different formats using spring batch?如何使用spring批处理处理不同格式的文件?
【发布时间】:2015-11-20 10:13:40
【问题描述】:

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

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

例如如果是 psv - 调用 PSV reader , PSV line mapper 如果是 csv - 调用 CSVReader , CSV line mapper

任何帮助将不胜感激。

谢谢

【问题讨论】:

标签: spring spring-batch


【解决方案1】:

您可以创建自己的 Reader : CustomFilesReader :

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,可以执行相同的操作。

【讨论】:

    【解决方案2】:

    感谢您的所有建议。

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

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

    谢谢

    【讨论】:

      【解决方案3】:

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

      问题是,您没有要分类的输入,因为读取尚未完成。这就是我考虑使用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(获取文件名,将其拆分以获取扩展名,并将其作为要匹配的字符串返回)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-19
        • 2018-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多