Пакетный API Java EE 7 (JSR-352): можно остановить один шаг, а не все задание?
Примечание: JSR-352, Java EE, wildfly 17.0.1, без весны
Я определил следующее задание в xml:
<?xml version="1.0" encoding="UTF-8"?>
<job id="xml2json" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd" version="1.0">
<flow id="flow">
<step id="step1" next="step2">
<batchlet ref="xmlRead">
</batchlet>
</step>
<step id="step2">
<batchlet ref="notificationBatchlet">
</batchlet>
</step>
</flow>
</job>
Мое требование - обработать остановку задания, и я могу сделать это, переопределив stop() в xmlRead (первый шаг).
Проблема в том, что мне также нужно быть уверенным, что второй шаг всегда выполняется, но из моих тестов, если я запускаю следующий код внутри первого пакета XmlRead:
if (shouldStop) {
log.warn("xmlRead - job stopped by user");
return FAILED.toString();
}
В конечном итоге статус выхода для задания будет FAILED (правильно!), Но второй шаг никогда не выполняется.
Есть идеи, как смоделировать этот сценарий?
1 ответ
У вас может быть список переходных элементов внутри первого шага вместо next
attributem, чтобы направлять поток выполнения задания в зависимости от статуса выхода (возвращаемое значение из пакетного пакета). Что-то вроде следующего:
<step id = "step1">
<batchlet ref="xmlRead"/>
<next on = "flag1" to = "step2"/>
<stop on = "flag2"/>
<fail on = "flag3"/>
</step>
Step2 может следить за тем же условием из другого распространенного компонента приложения, чтобы решить, что делать, или вы можете сохранить условие как данные выполнения задания (см. Как- то связанное обсуждение)
Я только что создал образец пакетного приложения batchlet-singleton.war, чтобы продемонстрировать использование пакетного пакета, одноэлементного сеансового компонента и условного перехода.