Liberty Batch не выдает исключение, когда задание запускается с тем же входным параметром, что и весенний пакет (JobInstanceAlreadyExistsException)
Автор вопроса: user3540722Ответов: 2
Я разрабатываю пакетное задание в java-ee-7 поверх сервера свободы. с помощью REST API для запуска пакетного задания. Проблема здесь в том, что когда я пытался запустить пакетное задание для того же входного параметра, создается новый экземпляр задания. В то время как весенний пакетный процесс выдает ошибку с сообщением JobInstanceAlreadyExistsException. Я ожидаю чего-то подобного, чтобы избежать создания нового задания для одного и того же входного параметра.
Входной параметр и статус пакета хранятся в постоянном хранилище в базе данных Oracle с использованием таблиц сервера Liberty (WLPJOBINSTANCE, WLPSTEPTHREADINSTANCE, wlpjobparameter и т. д.).
Ожидается: задание должно вызывать исключение, если передается тот же входной параметр. Фактически: создается новый экземпляр задания для того же входного параметра.
Использование Liberty Batch REST API, чтобы узнать, существует ли соответствующий экземпляр задания.
Я собираюсь дать второй, совершенно другой ответ здесь. Другой ответ объясняет, почему Liberty Batch и, в более общем смысле, спецификация JSR 352 никогда не будут считать ошибкой отправку второго задания с теми же параметрами задания, что и предыдущее.
Но если вы действительно хотите предотвратить это, вы можете сделать это в Liberty Batch, используя REST API для запроса перед отправкой, если соответствующий экземпляр задания уже существует. Однако на этом этапе вы можете прервать/предотвратить отправку задания.
Скажем, я хотел сопоставить jobName из BonusPayout с параметром задания parm1 со значением 1000 и параметром задания parm2, соответствующим 500* (с подстановочным знаком).
Примечание в doc есть различные другие варианты, такие как игнорирование регистра (или нет).
Поэтому, если я получу совпадение, я могу НЕ продолжать и отправлять задание (снова).
Ответ 2 · рейтинг 1 · Scott Kurz
Реализация Liberty Batch работает в соответствии со спецификацией JSR 352.
В Liberty Batch (или спецификации JSR 352) нет способа запретить вам создавать любое количество экземпляров заданий из заданного определения задания, и для этого вам придется создать собственный механизм.
Концептуальной отправной точкой в JSR 352 является определение задания, которое обычно будет выполняться многократно в соответствии с некоторым расписанием: ежедневно, ежемесячно, ежеквартально и т. д.
Ни в Liberty Batch, ни в спецификации нет ничего, что мешало бы вам запустить новый экземпляр задания через JobOperator start() или с помощью метода REST API Liberty Batch, через POST /ibm/api/batch/jobinstances/, поскольку некоторый похожий экземпляр задания уже существует. .
Вам запрещено перезапускать экземпляр задания, которое уже завершено, но нельзя создавать новые экземпляры задания.
Это сформулировано по-другому в этом ответе, и вы найдете концепции спецификации, обсуждаемые более подробно here.
Таким образом, все, что предоставляет здесь Spring Batch, уникально для его реализации.