Spring Batch найти начало выполнения работ - PullRequest
0 голосов
/ 11 июля 2019

У меня есть приложение Spring Batch с одним заданием.Порядок выполнения заданий очень важен для меня, поэтому JobLauncher настроен как однопотоковый пул заданий.Другими словами, если было запущено несколько исполнений, одно выполнение будет запущено, а другое будет ждать в очереди.

Таблица выполнения задания будет выглядеть следующим образом:

        ╒═════╤═════════════════════╤════════════╤════════════╤═════╕
        │ ... │ START_TIME          │ END_TIME   │ STATUS     │ ... │
        ╞═════╪═════════════════════╪════════════╪════════════╪═════╡
        │ ... │ 2019-07-11 11:03:08 │ NULL       │ STARTED    │ ... │
        ├─────┼─────────────────────┼────────────┼────────────┼─────┤
        │ ... │ NULL                │ NULL       │ STARTING   │ ... │
        └─────┴─────────────────────┴────────────┴────────────┴─────┘

Если JVM падает, мне нужно выйти из этого состояния и провести некоторый аудит, поэтому мне нужно найти все STARTED и STARTING казней.

Найти первый не проблема, я могу сделать это с JobExplorer:

Set<JobExecution> executions = jobExplorer.findRunningJobExecutions("jobName");

Это даст мне только STARTED выполнение с настоящим START_TIME.Но как найти все STARTING казни?

Единственный способ, который я нашел до сих пор, - это перебирать экземпляры задания, а затем находить STARTING выполнение для каждого экземпляра.Примерно так:

        jobExplorer.findJobInstancesByJobName("jobName", 0, 100)
                .forEach(jobInstance -> {
                    jobExplorer.getJobExecutions(jobInstance)
                            .stream()
                            .filter(execution -> STARTING.equals(execution.getStatus()))
                            .forEach(execution -> {
                                // do the job
                            });
                });

Проблема здесь в том, что вы всегда делаете полное сканирование с ограничением (я указал 100).Есть ли лучший способ, как jobExplorer.findStartingJobExecutions("jobName") в Spring Batch?

1 Ответ

0 голосов
/ 11 июля 2019

Я не вижу общедоступных API для выполнения задания по статусу.Что вы можете сделать, это (в псевдокоде):

JobInstance jobInstance = jobInstanceDao.getJobInstance(jobName, jobParameters);
List<JobExecution> jobExecutions =  jobExplorer.findJobExecutions(jobInstance);
// iterate over job execution and filter by status

Это позволит избежать загрузки всех экземпляров задания (по сто за раз).

Тем не менее, я думаю, что JobRepositoryИнтерфейс может добавить метод для получения экземпляра задания по имени и параметрам (аналогично isJobInstanceExists), чтобы избежать использования jobInstanceDao, как показано в моем предыдущем фрагменте.

РЕДАКТИРОВАТЬ:

Полагаю, ваше первоначальное требование - пометить выполнение задания как неспособное перезапустить его.Для этого вы можете вручную изменить статус выполнения задания (а также его пошаговое выполнение) на FAILED и установить для его END_TIME ненулевое значение (это объясняется здесь: https://docs.spring.io/spring-batch/4.1.x/reference/html/job.html#aborting-a-job). С этим,вы сможете перезапустить неудачные выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...