spring批处理多个子目录中的多个源

时间:2014-02-24 14:13:48

标签: java xml spring spring-batch

我是春季批处理新手并且通过spring批处理读取multipartItemReder,我想multipartItemReader不适合我的项目。请通过你的想法和公会得到几点。

我有超过5000万个xml文件,如下面的目录结构。

 GOOD
    0
      001/en/1.xml
      001/jp/1.xml
      002/en/2.xml
      003/en/3.xml
      004/jp/4.xml
       .... 
       ....
      999/jp/1.xml  
    1000
      001/en/1.xml
      001/jp/1.xml
      002/en/2.xml
      003/en/3.xml
      004/jp/4.xml
       .... 
       ....
      999/jp/1.xml  
    2000
    3000
    ... 
    .. no limit 
 REMAKE/
    0
      001/en/1.xml
      001/jp/1.xml
      002/en/2.xml
      003/en/3.xml
      004/jp/4.xml
       .... 
       ....
      999/jp/1.xml  
 PROCLAIMED/
 ...
  ...
  ....
  like 100 directories ..  

每个来源(GOOD,REMAKE,PROCLAIMED ......等)都有不同的xml文件格式。 1.我需要为每个来源创建项目处理器。 2.每个源都是一个线程或者具有commit transaction = 1或者是基于SOURCE ////。xml内的lang文件数的线程跨度,什么是更好的选择。 3.我仍然觉得IteamReader是一个复杂的实现。这里每个xml文件只有一个记录。请分享您的意见。

由于

1 个答案:

答案 0 :(得分:2)

这种情况的最佳实践可能是使用 partitioning;我没有尝试过,所以我不能帮助很多,但是我认为当您需要管理相同类型的数据时,分区是有用的,而不是在数据混合的情况下。

现在我的2美分......
我会去parallel steps

  1. 使用split/flow
  2. 将每个源作为单独的线程进行管理
  3. 无需commit-interval等于1;您可以使用较大的值(或自定义CompletionPolicy,如果您想要一个细粒度的提交)来提高性能
  4. 使用MultiResourceItemReader委托给每种来源的StaxEventItemReader
  5. 读者返回的各种对象的专用处理器
  6. 作家(取决于您的需要)

  7. <job id="job1">
      <split id="split1" task-executor="taskExecutor" next="lastStep">
        <flow>
          <step id="GOOD" />
        </flow>
        <flow>
          <step id="REMAKE" />
        </flow>
        <flow>
          <step id="PROCLAIMED" />
        </flow>
      </split>
      <step id="GOOD">
        <tasklet>
          <batch commit-interval="100">
            // Set MultiResourceItemReader and delegate to specialized StaxEventItemReader for GOOD file structure
            // Set specialized processor for GOOD object
            // Set writer (IDK which type)
          </batch>
      </step>
    </job>