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, уникально для его реализации.

Другие вопросы по тегам