2012-03-01 57 views
2

我使用Spring Batch从Wikipedia XML转储文件(单个30多个gig文件)中提取一些数据。我使用StaxEventItemReader来读取标签,然后在每个页面上进行一些分析。一旦对每个条目的分析完成后,我将生成的数据注入到数据库中。这是一个非常简单的Spring Batch的工作流程:使用多线程执行Spring批处理阶段

read->process->write 

我想处理阶段是多线程的,因为它是自包含的,处理器密集型和写阶段不依赖的顺序。

 /process\ 
read<-process->write 
    \process/ 

我已阅读this问题,其中最多的回答说,级之间的数据存储在JobRepository和说,这是不可取的,存储大量数据的存在。

我已经看到了Spring Batch发行版中的'并行'示例,但是它并行处理整个第二个'加载'步骤(即读取器,处理器和写入器),而不是仅仅并行运行处理。

是否有可能说过程阶段应该在特定大小的线程池中处理?我的工作流程是否适合Spring Batch,还是将它改写为正常的J2SE程序更好?

+0

我不知道春季批次,但你见过[5.3.5。 Split Flows](http://static.springsource.org/spring-batch/reference/html/configureStep.html#split-flows)章节中的文档? – 2012-03-01 12:42:09

+0

我有,但我很难看到如何实现我想要的。 5.3.5和7.2并行步骤中的示例没有显示信息如何在它们之间传递,似乎也没有显示如何将读取的数据分配到处理线程中。 – Rich 2012-03-01 12:49:01

+0

[7.1在文档](http://static.springsource.org/spring-batch/reference/html/scalability.html)说,你可以简单地配置一个'TaskExecutor'到步骤,这将自动导致每个块到在单独的线程中处理。 (我曾经这样做过一次,它只是一个概念验证,它的工作原理与前面描述的一样。) 缺点是'StaxEventItemReader'不是线程安全的。此外,这并不真正回答如何在读者之间传递数据的问题;即使你自己写了,也没有办法分享真正有效的数据。 – Ickster 2012-03-05 13:37:46

回答

0

您的读者必须是线程安全的。 如果这是不可能的,我建议你使用一个临时区域:

  • 第一步:分析你的DATAS并将它们存储在一个方便的格式某处。
  • 完成后,开始第二步:使用多线程,sql批处理和Java中的所有东西插入数据以提高性能。

也许NoSQL数据库可能是存储临时数据的好候选者。

相关问题