У меня есть приложение 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?