Liberty Batch не выдает исключение, когда задание запускается с тем же входным параметром, что и весенний пакет (JobInstanceAlreadyExistsException)

Я разрабатываю пакетное задание в java-ee-7 поверх сервера свободы. с помощью REST API для запуска пакетного задания. Проблема здесь в том, что когда я пытался запустить пакетное задание для того же входного параметра, создается новый экземпляр задания. В то время как весенний пакетный процесс выдает ошибку с сообщением JobInstanceAlreadyExistsException. Я ожидаю чего-то подобного, чтобы избежать создания нового задания для одного и того же входного параметра.

Входной параметр и статус пакета хранятся в постоянном хранилище в базе данных Oracle с использованием таблиц сервера Liberty (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>

Ожидается: задание должно вызывать исключение, если передается тот же входной параметр. Фактически: создается новый экземпляр задания для того же входного параметра.


person user3540722    schedule 04.01.2019    source источник


Ответы (2)


Использование Liberty Batch REST API, чтобы узнать, существует ли соответствующий экземпляр задания.

Я собираюсь дать второй, совершенно другой ответ здесь. Другой ответ объясняет, почему Liberty Batch и, в более общем смысле, спецификация JSR 352 никогда не будут считать ошибкой отправку второго задания с теми же параметрами задания, что и предыдущее.

Но если вы действительно хотите предотвратить это, вы можете сделать это в Liberty Batch, используя REST API для запроса перед отправкой, если соответствующий экземпляр задания уже существует. Однако на этом этапе вы можете прервать/предотвратить отправку задания.

Скажем, я хотел сопоставить jobName из BonusPayout с параметром задания parm1 со значением 1000 и параметром задания parm2, соответствующим 500* (с подстановочным знаком).

Я мог бы сделать это через URL:

https:///ibm/api/batch/v4/jobinstances?jobName=BonusPayout&jobParameter.parm1=1000&jobParameter.parm2=500*

Примечание в doc есть различные другие варианты, такие как игнорирование регистра (или нет).

Поэтому, если я получу совпадение, я могу НЕ продолжать и отправлять задание (снова).

person Scott Kurz    schedule 08.01.2019
comment
Спасибо, Скотт. Это лучший способ. Используя вызов GET в REST API, чтобы получить список экземпляров, и, если они совпадают, я могу отказаться от повторной отправки задания. - person user3540722; 14.01.2019

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

person Scott Kurz    schedule 05.01.2019
comment
Сказав все это, мне было бы интересно узнать больше о вашем варианте использования (мотивации) в комментарии. Спасибо. - person Scott Kurz; 05.01.2019
comment
Согласовано. Как мы можем предотвратить повторный запуск задания для того же входного параметра. - person user3540722; 08.01.2019
comment
Согласовано. Как мы можем предотвратить повторный запуск задания для того же входного параметра (при условии, что предыдущий запуск все еще выполняется). Например: в 14:00 запуск задания для параметров ( startDate : 20.04.2017, endDate : 21.04.2017) В 14:02 снова запуск задания для тех же входных параметров (Примечание: предыдущее задание все еще выполняется). В этом случае я ожидаю, что пакетная служба не должна была запускать новый экземпляр, потому что он уже создал экземпляр для заданных параметров и все еще работает. Я считаю, что в этом случае весенняя партия выдает исключение, такое как JobInstanceAlreadyExistsException. - person user3540722; 08.01.2019
comment
Таким образом, концептуальная основа объясняет, почему мы не рассматривали это как основной вариант использования со встроенной поддержкой в ​​нашей спецификации и REST API. Поэтому я полагаю, что лучший способ сделать это, если вы все еще действительно этого хотите, — это использовать REST API для предварительного поиска перед отправкой нового экземпляра задания (поскольку, как уже упоминалось, мы никогда не завершим отправку, потому что какое-то другое задание экземпляр уже существует). Тогда я дам второй, другой ответ, объясняющий, как вы можете это сделать. - person Scott Kurz; 08.01.2019