2013-05-02 3 views
9

Моего сценария обработки файла,обработка файлов на две разных машин с помощью пружинных партий

read input file -> process -> generated output file 

, но у меня есть два физически разных машин, которые подключены к одной области хранения, где я получал все входные файлы и одну базы данных сервер. На этой машине работают два сервера приложений (1 на каждом сервере).

enter image description here

так, как я могу использовать пружинный пакет для обработки входных файлов на обоих этих сервере приложений параллельно? я имею в виду, если есть 10 файлов 5 на сервере 1 (P1) и 5 ​​на (P2), это можно сделать?

+0

сгенерированный выходной файл = записать результат в базу данных ?, или база данных используется только для метаданных весенней партии? и вы действительно записываете выходные файлы в свою файловую систему? – Cygnusx1

+0

Да, я должен сгенерировать файл с файлом в файловой системе, DB используется для хранения данных входного файла, и после обработки этих деталей я должен создать файл put. –

+0

Если между вашими файлами нет зависимостей, я не понимаю, почему вы не могли этого сделать. Единственное, что вам нужно проверить, - не обрабатывать один и тот же файл на обоих заданиях! Но это будет ответственностью вызывающего ... Как вы начинаете свою работу? Schedular? a ksh? – Cygnusx1

ответ

-1

Существует довольно простой способ сделать это. Если я правильно понял, вы помещаете каждый файл в базу данных (некоторые сведения об этом), а затем удаляете для создания нового вывода. Вы можете заблокировать() на нем, Перед чтением файла у проверить

for(File file : fileList.getFiles()) 
    try{ 
     (getting file + process it) 
     } 

и в процессе

 file.lock(); 
    try { 
     ... 
    } finally { 
     file.unlock(); 
    } 

Вот некоторая информация о Lock.

+1

будет ли эта блокировка работать, если задействованы два JVM? потому что там задействованы различные машины, которые не подключены. –

4

Вы можете запланировать задание на входной файл (расположение входного файла будет параметром задания). Spring Batch гарантирует отсутствие двух экземпляров задания с одинаковыми параметрами задания. Вы получите JobExecutionAlreadyRunningException или JobInstanceAlreadyCompleteException, если другой узел уже начал обрабатывать тот же файл.

+0

Это решение для довольно классической пакетной задачи, открытой здесь. –

+0

Я получу JobExecutionAlreadyRunningException это исключение, если задания выполняются с двух разных машин? Поскольку мое приложение EAR будет развернуто на обеих этих машинах, которые запускают эти задания. –

1

Первым делом нужно решить, хотите ли вы разделить файлы пополам (5 и 5), или вы хотите, чтобы каждый сервер обрабатывался до тех пор, пока это не будет выполнено? Если файлы имеют различные размеры с небольшими и другими большими, вы можете получить оптимальную распараллеливание, имеющую 6 обработанных на одном сервере, а 4 - на другом, или 7 и 3, если 3 принимают столько же, сколько остальные 7 из-за различий в размере.

Очень рудиментарным способом было бы иметь таблицу базы данных, которая могла бы представлять собой активную обработку. Ваша работа может прочитать каталог, захватить первое имя файла и затем вставить в таблицу, которую он обрабатывал с помощью JVM. Если первичным ключом таблицы является имя файла, то если оба они попытаются в одно и то же время, вы потерпите неудачу, и вам удастся добиться успеха. Тот, который преуспевает при вставке записи в таблицу, выигрывает и получает для обработки файла. Другой должен обработать это исключение, выбрать следующий файл и попытаться вставить его в качестве записи обработки. Таким образом, каждый из них по существу устанавливает централизованный замок (в таблице db), и вы получаете более эффективную обработку, которая учитывает размер файла, а не даже распределение файлов.

0

Вот мои предложения:

  • создать таблицу фиксирующее в БД с пути к файлу в качестве первичного ключа. Затем попробуйте вставить запись с этим ключом - если это удастся, ваш код может продолжить и обработать файл, если не удается (исключение, которое записывается с этим основным ключом), а затем перейти к следующему файлу.

  • точное планирование, как уже упоминалось ранее Джимми

  • вы можете попробовать использовать очереди (как ActiveMQ, RabittMQ, ...) для синхронизации ваших аппаратов

Смежные вопросы