Liberty Batch не выдает исключение, когда задание запускается с тем же входным параметром, что и весенний пакет (JobInstanceAlreadyExistsException)
Я разрабатываю пакетную работу в Java-EE-7 на вершине сервера свободы. используя REST API для запуска пакетного задания. Проблема в том, что когда я пытался запустить пакетное задание для того же входного параметра, создается новый экземпляр задания. Принимая во внимание, что весенний пакетный процесс, выдает ошибку, говоря JobInstanceAlreadyExistsException. Я ожидаю что-то подобное, чтобы избежать создания нового задания для того же входного параметра
Входной параметр и статус пакета были сохранены в постоянном хранилище в базе данных Oracle с использованием таблиц сервера свободы (WLPJOBINSTANCE, WLPSTEPTHREADINSTANCE, wlpjobparameter и т. Д.).
<job xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd"
id="my-batch-job" restartable="true" version="1.0">
</job>
Ожидается: задание должно выдавать исключение, если передан тот же входной параметр. Фактически: создается новый экземпляр задания для того же входного параметра.
2 ответа
Использование Liberty Batch REST API, чтобы проверить, существует ли соответствующий экземпляр задания
Я собираюсь дать второй, совершенно другой ответ здесь. Другой ответ оправдывает, почему Liberty Batch и, в более общем случае, спецификация JSR 352, никогда не сочтет ошибкой отправку второго задания с теми же параметрами задания, что и ранее.
Но если вы действительно хотите предотвратить это, вы можете сделать это в Liberty Batch, используя REST API для запроса перед отправкой, если соответствующий экземпляр задания уже существует. Однако на этом этапе вы можете прервать / предотвратить подачу задания.
Скажи, что я хочу соответствовать jobName из BonusPayout
, с параметром задания parm1 значения 1000
и сопоставление параметра задания parm2 500*
(с глобусом / подстановочным знаком).
Я мог бы сделать это через URL:
https: /// IBM / апи / партии /v4/jobinstances JobName=BonusPayout&jobParameter.parm1=1000&jobParameter.parm2=500*
Обратите внимание, в документе есть различные другие варианты, такие как игнорирование регистра (или нет).
Так что, если я получу совпадение, я могу выбрать НЕ идти вперед и отправить работу (снова).
Реализация Liberty Batch работает так, как задумано, в соответствии со спецификацией JSR 352.
В Liberty Batch (или в спецификации JSR 352) нет способа помешать вам создать любое количество экземпляров заданий из заданного определения задания, и вам придется создать собственный механизм для этого.
Концептуальной отправной точкой в JSR 352 является определение задания для задания, которое обычно будет выполняться повторно в соответствии с некоторым расписанием: ежедневно, ежемесячно, ежеквартально и т. Д.
В Liberty Batch или спецификации нет ничего, что могло бы помешать вам запустить новый экземпляр задания с помощью метода start() JobOperator или, используя Liberty Batch REST API, через POST /ibm/api/batch/jobinstances/
потому что некоторый подобный экземпляр работы уже существует.
Вам запрещается перезапускать экземпляр задания, который уже завершен, но никогда не создается новые экземпляры задания.
В этом ответе это сформулировано иначе, и вы найдете концепции спецификаций, которые обсуждаются здесь более подробно.
Поэтому все, что предоставляет Spring Batch, уникально для его реализации.