2013-03-27 1 views
3

Как обеспечить, чтобы работа выполнялась, она не может запускаться снова в одно и то же время?Spring-Batch: как обеспечить выполнение задания, одновременно не разрешается запускать его снова

У нас есть BJ, для обработки подачи и заполнения временных таблиц требуется 1 час. Первый шаг этого BJ состоит в том, чтобы очистить временные таблицы и начать заполнять данные из главных таблиц магазина магазина.

Рассмотрите сценарий, когда при запуске BJ (при первом запуске), если мы снова запустим BJ, он удалит контент из временных таблиц как часть первого шага.

Итак, пожалуйста, предложите, как я могу провести второе исполнение до тех пор, пока первый не будет ЗАВЕРШЕН?

+1

увидеть мой ответ здесь, чтобы получить представление о том http://stackoverflow.com/a/11703889/305142 –

ответ

3

Вы можете создать собственный Tasklet в качестве своего первого шага и использовать JobExecutionDao, чтобы найти все JobExecutions. Если есть более одного running - выбросьте исключение.

+0

Есть ли способ, которым я могу достичь этого в Partitioner, чтобы это можно было сделать глобально ... – techanuva

0

Вы можете настроить пользовательский интерфейс Admin-Batch-Admin для просмотра состояния заданий (неработающие/запущенные/завершенные и т. Д.). При правильной настройке пользовательского интерфейса Spring Batch Admin вы можете даже просмотреть состояние нескольких задач внутри разных заданий.

+0

мы уже создали Весенний пакетный администратор.Поэтому, пожалуйста, предложите, как я могу провести второе исполнение до тех пор, пока первый не будет ЗАВЕРШЕН программно. Так что второе выполнение задания не запускается до тех пор, пока первый не будет завершен. – techanuva

0

Реализация этого в рамках одной JVM должна выполняться с использованием двоичного семафора. Это поможет избежать параллельных исполнений одной и той же работы. Выполнение ожидания второго экземпляра будет немного сложным, если вы не хотите, чтобы он просто пропускал выполнение, если установлено значение семафора.

Вы можете выполнить более сложную сериализацию (в том числе через узлы весны), используя подходящую реализацию «Выборы лидера». В моем проекте я использовал Netflix Curator (рецепт Apache Zookeeper). Некоторые указатели здесь: https://github.com/regunathb/Trooper/wiki/Useful-Batch-Libraries

1

Уверен, это не будет лучшим решением, но я надеюсь, что это все равно послужит вашей ситуации.

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

Таким образом, это даст ошибку и не позволит вам одновременно выполнять 2 исполнения одной и той же работы. Удаление приведет к разрешению серийного исполнения.

АЛЬТЕРНАТИВНЫЙ МЕТОД: Напишите свою работу с одним параметром job-execution-id. Каждый раз перед выполнением задания запрашивает максимальное значение из job-execution-id для выполненных заданий из таблиц партий для задания. Теперь запустите задание с job-execution-id с шагом 1 в качестве входного параметра.

Я думаю, что это лучший метод, чем выше. Я не уверен, если сама springbatch предоставляет любые простые варианты удаления для реализации этого сценария.

0

Возможно, я неверно истолковал ваш вопрос, но вы можете ограничить количество параллельных исполнений любого отдельного шага, указав throttle-limit на Tasklet в шаге. Задание необходимо убедиться, что у вас есть только одно исполнение в то время:

<batch:step id="stepA" next="stepB"> 
    <batch:tasklet throttle-limit="1"> 
    <batch:chunk reader="myReader" writer="myWriter" commit-interval="100"/> 
    </batch:tasklet> 
</batch:step> 

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

  • Нет связанных вопросов^_^