Как опросить BatchStatus для выполнения работы? - PullRequest
1 голос
/ 21 июня 2019

У меня есть пакетное задание, которое нужно повторить для списка предметов. Итак, у меня есть «родительское» задание, которое использует пакетный шаг для загрузки списка и запуска дочернего задания для каждого идентификатора в списке. Каждое дочернее задание запускается с использованием JobOperator и параметром с использованием Свойства класса, и это работает нормально, как и ожидалось.

Мне нужно получить статус пакета и дождаться завершения дочернего задания, чтобы выполнить итерацию по списку. Я пытаюсь получить статус пакета или статус выхода, используя класс JobExecution , однако JobExecution не получает статус пакета для дочернего задания.

Вместо этого я всегда вижу статус пакета STARTED, даже после завершения дочерней работы.

Мой код выглядит так:

for (int i = 1; i <= rsList; i++) {
            long execId = jobOperator.start("gah-history-chunk-archive-job",jobParamProperties);
            JobInstance jobInstance = jobOperator.getJobInstance(execId);
            JobExecution jobExecution = jobOperator.getJobExecution(execId);
            logger.info("Instance id: "+jobInstance.getInstanceId());
            while(!jobExecution.getBatchStatus().toString().equals("COMPLETED") || !jobExecution.getBatchStatus().toString().equals("FAILED")) {
                //Both batch status and exit status giving the status of this batchlet, not giving the status of gah-history-chunk-archive-job
logger.info("Batch status is: "+jobExecution.getBatchStatus() +" Thread is sleeping for 5 seconds");
                logger.info("Exit status:"+jobExecution.getExitStatus());

                Thread.sleep(300);
            }
        }

Я хочу знать, как получить пакетное состояние или выйти из дочернего задания, запущенного из пакетного режима. Почему я продолжаю видеть BatchStatus STARTED?

Ответы [ 3 ]

1 голос
/ 24 июня 2019

Чтобы «опросить» статус JobExecution, вы должны получать новый экземпляр от JobOperator каждый раз, когда проверяете его состояние.Так что получите JobExecution внутри цикла while, а не снаружи.

Так что это должно быть больше похоже, например:

do {
  Thread.sleep(300);

  // log or whatever

  BatchStatus status = jobOperator.getJobExecution(execId).getBatchStatus();

}  while(status != BatchStatus.COMPLETED && status != BatchStatus.FAILED) ;

Это немного сложно, потому что поведение здесь не стандартизировано спецификацией.
Поскольку спецификация допускаетразнообразие реализаций репозитория заданий (например, база данных, простая карта в памяти, другое, ...), для «кэшированного» JobExecution не требуется особого поведения, и вы можете обнаружить, что оно «работает» некоторое времяс вашим исходным кодом.

Я не думаю, что вы на самом деле видите возвращаемый экземпляр "родительского" объекта;Я подозреваю, что вы можете просто запутаться, не увидев того, что ожидали.

В любом случае, чтобы ваш код был более переносимым, получайте JobExecution с каждой проверкой состояния.

0 голосов
/ 26 июня 2019

Я бы рекомендовал опросить Exitstatus задания вместо самого BatchStatus:

for (int i = 1; i <= rsList; i++) {
    long execId = jobOperator.start("gah-history-chunk-archive-job",jobParamProperties);
    JobInstance jobInstance = jobOperator.getJobInstance(execId);
    JobExecution jobExecution = jobOperator.getJobExecution(execId);
    logger.info("Instance id: "+jobInstance.getInstanceId());
    while(jobExecution.getExitStatus() == null) {
        //do your logging etc.   
        Thread.sleep(300);
    }
}
0 голосов
/ 21 июня 2019

JobExecution указывает на родительское задание, даже если оно было настроено с идентификатором выполнения дочернего задания.Не уверен, почему пакет ведет себя так.

JobExecution jobExecution = jobOperator.getJobExecution(execId);
jobExecution.getBatchStatus(); //Parent job status

Но если мы пойдем с классом BatchRuntime, мы можем получить соответствующее задание, статус пакета.Это помогает мне получить статус дочерней работы и может перейти к следующему пакетному запуску.

//Returns the child job status as expected
BatchRuntime.getJobOperator().getJobExecution(execId).getBatchStatus();

...