2012-03-01 7 views
2

Я использую Spring Batch для извлечения некоторых данных из файла дампа XML Википедии (один 30-нечетный файл-файл). Я использую StaxEventItemReader для чтения в тегах, а затем сделайте анализ на каждой странице. Когда анализ каждой записи будет завершен, я буду вводить полученные данные в базу данных. Это очень простой Spring Batch рабочий процесс:Выполнение этапа пакетной обработки Spring с несколькими потоками

read->process->write 

Я хотел бы этап обработки, чтобы быть многопоточной, так как она является самодостаточным, процессор интенсивно, и этап записи не зависит от порядка.

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

Я прочитал this вопрос, где верхний ответ говорит, что данные между ступенями хранятся в JobRepository и говорит, что не желательно хранить большие объемы данных там.

Я видел параллельный пример в дистрибутиве Spring Batch, но он обрабатывает весь второй шаг «загрузка» (то есть читатель, процессор и сценарист) параллельно, а не просто выполняет параллельную обработку ,

Можно ли сказать, что этап процесса должен обрабатываться в поточной сети определенного размера? Работает ли мой рабочий процесс с Spring Batch, или лучше переписать его как обычную программу J2SE?

+0

Я не знаю Весеннюю партию, но вы видели [5.3.5. Разделить потоки] (http://static.springsource.org/spring-batch/reference/html/configureStep.html#split-flows) в документации? –

+0

У меня было, но мне трудно понять, как добиться того, чего я хочу. Примеры в параграфах 5.3.5 и 7.2 Parallel Steps не показывают, как информация передается между ними, и, похоже, не показывают, как считываемые данные могут быть разделены по потокам обработки. – Rich

+0

[7.1 в документации] (http://static.springsource.org/spring-batch/reference/html/scalability.html) говорит, что вы можете просто настроить «TaskExecutor» на шаг, который автоматически приведет к тому, что каждый кусок будет обрабатываться в отдельном потоке. (Я сделал это как доказательство концепции, и он в значительной степени работал, как описано.) Недостатком является то, что 'StaxEventItemReader' не является потокобезопасным. Кроме того, на самом деле это не отвечает на вопрос о том, как передавать данные среди читателей; даже если вы написали свои собственные, нет никакого способа обмена данными, которые действительно эффективны. – Ickster

ответ

0

Ваш читатель должен быть потокобезопасным. Если это не представляется возможным, то я предлагаю вам использовать плацдарм:

  • первого шаг: анализировать ДАННЫЕ и хранить их в удобном формате где-нибудь.
  • как только закончите, начните второй шаг: вставьте данные, используя многопоточность, sql-пакет и все, что у нас есть на Java, чтобы повысить производительность.

Возможно, база данных NoSQL может быть хорошим кандидатом для хранения промежуточных данных.