Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: user3540722Ответов: 2

Я разрабатываю пакетное задание в 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>

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

javawebsphere-libertyjakarta-eejava-ee-7jsr352

Ответы

Ответ 1 · рейтинг 1 · Scott Kurz

Использование 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 есть различные другие варианты, такие как игнорирование регистра (или нет).

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы