Пакетный шаг Java с разделом возвращает неправильный batchStatus и exitStatus
У меня есть (очень простая) пакетная работа Java в JDL всего за два шага.
Когда на шаге "загрузка" возвращается статус "ОСТАНОВЛЕНО", задание должно быть остановлено. После перезапуска должно быть вызвано уведомление об остановке.
Без раздела все работает нормально.
статистика без раздела
after step=download batchStatus=COMPLETED exitStatus=STOPPED
after job=job batchStatus=STOPPED exitStatus=STOPPED
С разделом я получаю действительно странные стати для выхода из партии. И задание не останавливается, если шаг загрузки возвращает "ОСТАНОВЛЕНО". Даже если раздел имеет только один поток и один раздел.
При попытке перезагрузки возникает следующая ошибка (конечно). JBERET000609: Выполнение задания 1 уже завершено и не может быть перезапущено.
статистика с разделом
after step=download batchStatus=STARTED exitStatus=null
after job=job batchStatus=COMPLETED exitStatus=COMPLETED
сокращение рабочих мест
<job id="job" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0" restartable="true">
<step id="download" next="notify">
<batchlet ref="downloadBatchlet">
</batchlet>
<partition>
<mapper ref="basicPartition" />
</partition>
<stop on="STOPPED" restart="notify"/>
</step>
<step id="notify">
<batchlet ref="notifyBatchlet"></batchlet>
<end on="COMPLETED"/>
</step>
</job>
Каждый намек приветствуется. Чего мне не хватает?
Без раздела
При запуске задания вызывается - downloadBatchlet => STOPPED и stoppss.
При перезапуске задание вызывает - notifyBatchlet => COMPLETED и завершается.
С разделом
При запуске задания вызывается - downloadBatchlet => STOPPED и stoppss.
При перезапуске работа вызывает НЕТ ШАГОВ и заканчивается.
@Named
public class DownloadBatchlet extends AbstractBatchlet {
@Override
public String process() throws Exception {
return BatchStatus.STOPPED.toString();
}
@Override
public void stop() throws Exception {
}
}
1 ответ
Раздел по сравнению с партией верхнего уровня / статусом выхода
В Java Batch есть отдельное состояние пакета и выхода для самого шага, а также для каждого раздела.
Поскольку "переход" (к следующему шагу или для остановки задания, в вашем случае) происходит здесь на уровне задания, вам потребуется установить состояние выхода не по умолчанию на "верхнем уровне" шага, а не просто на уровне каждого раздела.
Если вы хотите включить логику, которая реагирует на состояние каждого раздела, хорошей отправной точкой будет метод PartitionAnalyzer#analyStatus, который вызывается при завершении каждого раздела. Это выполняется в потоке "верхнего уровня" (как и PartitionReducer).
Простой пример Analyzer
public class MyPartitionAnalyzer extends AbstractPartitionAnalyzer {
@Inject
private StepContext stepCtx;
@Override
public void analyzeStatus(BatchStatus batchStatus, String exitStatus) throws Exception {
// Overrides default exit status if non-COMPLETED partition seen
if (!exitStatus.equals(BatchStatus.COMPLETED)) {
stepCtx.setExitStatus(exitStatus);
}
}
}
Вы можете использовать любую логику, которую хотите (или нет), чтобы реагировать на состояние пакета и выход из него. Ключевым моментом здесь является то, что анализатор работает в шаговом потоке верхнего уровня и устанавливает статус уровня шага. Возвращаемое значение пакета, с другой стороны, только устанавливает статус уровня раздела.
Анализатор можно использовать для "агрегирования" статуса на уровне раздела, как вам угодно. Если вы ничего не делаете, статусом выхода уровня шага по умолчанию является состояние пакета уровня шага, поэтому, если шаг завершается нормально, статус выхода уровня шага ЗАВЕРШЕН.