Синхронизировать пакетные приложения, развернутые на разных серверах, для обработки файла только одним сервером - PullRequest
0 голосов
/ 07 июня 2019

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

Я не нахожу ничего конкретного в интернете. У меня есть пара идей, чтобы справиться с этим, как указано ниже. 1. Используйте FileChannel tryLock, чтобы получить блокировку файла и переместить файл после его прочтения. 2. Вести таблицу в разделяемой БД для ведения записи, скажем «fileReadJobExcution» со статусом NULL изначально. Когда запускается пакетное приложение, оно просматривает эту таблицу, чтобы получить запись со статусом null и попытаться обновить статус как IN_PROGRESS. Поэтому любому узлу (серверу), получающему updateCount> 0, будет разрешено считывать файл из общего расположения, и после успешного выполнения этого пакета пакетный статус обновляется до NULL.

Я ищу, если что-то уже доступно в Spring Batch или JAVA для обработки многоузловой синхронизации с общим сервером. Пожалуйста, помогите с предложениями.

1 Ответ

0 голосов
/ 07 июня 2019

Звучит так, как будто вы можете использовать дистанционное разбиение на части или разбиение для достижения своей цели. Из того, что вы описали, я думаю, что разделение будет работать лучше всего.

Вы можете создать мастер Step для получения списка файлов, а затем делегировать обработку этих файлов подчиненным объектам Step - удаленно или локально в разных потоках - передавая имя файла через ExecutionContext.

Проект GitHub Spring Batch Samples имеет несколько замечательных примеров, и я думаю, вы можете найти partitionFileJob.xml особенно полезным.

В частности, просмотрите следующие Bean определения из примера проекта:

<job id="partitionJob" xmlns="http://www.springframework.org/schema/batch">
    <step id="step">
        <partition step="step1" partitioner="partitioner">
            <handler grid-size="2" task-executor="taskExecutor" />
        </partition>
    </step>
</job>

<bean id="partitioner" class="org.springframework.batch.core.partition.support.MultiResourcePartitioner">
        <property name="resources" value="classpath:data/iosample/input/delimited*.csv" />
</bean>

<bean id="itemReader" scope="step" autowire-candidate="false" parent="itemReaderParent">
        <property name="resource" value="#{stepExecutionContext[fileName]}" />
</bean>
...