DuplicateKey Exception при попытке запустить пакетное задание в нескольких экземплярах - PullRequest
0 голосов
/ 30 марта 2020

Я одновременно запускаю пакетное задание в кластере с теми же параметрами. Хотя хорошо, что он работает только в одном экземпляре, но я получаю исключение:

Detail: Key (job_name, job_key)=(offlineTicketRefreshJob, c5d36835a13fd8ae0e91a69a6fa1c2d8) already exists.; nested exception is org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "job_inst_un"

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

1 Ответ

1 голос
/ 30 марта 2020

Этого не должно быть, если вы правильно настроили уровень изоляции в своем хранилище заданий. Вы не предоставили доступ к своей конфигурации репозитория заданий, но вы можете найти пример в Конфигурирование JobRepository и Конфигурация транзакций для JobRepository разделы:

// This would reside in your BatchConfigurer implementation
@Override
protected JobRepository createJobRepository() throws Exception {
   JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
   factory.setDataSource(dataSource);
   factory.setTransactionManager(transactionManager);
   factory.setIsolationLevelForCreate("ISOLATION_SERIALIZABLE");
   factory.setTablePrefix("BATCH_");
   factory.setMaxVarCharLength(1000);
   return factory.getObject();
}

Агрессивный уровень изоляции не позволяет создавать дубликаты экземпляров заданий в кластерной среде. SERIALIZABLE и READ_COMMITTED должны работать.

...