Исключение DuplicateKey при попытке запустить пакетное задание на нескольких экземплярах

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

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?


person sachin    schedule 30.03.2020    source источник


Ответы (1)


Этого не должно произойти, если вы правильно настроите уровень изоляции в своем репозитории заданий. Вы не предоставили общий доступ к конфигурации репозитория заданий, но вы можете найти пример в Настройка 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 должны работать.

person Mahmoud Ben Hassine    schedule 30.03.2020
comment
Разве изоляция по умолчанию не SERIALIZABLE, как указано в той же документации, поэтому я не настраивал репозиторий заданий и использовал значение по умолчанию. - person sachin; 30.03.2020
comment
да, SERIALIZABLE используется по умолчанию, и postgres поддерживает его (postgresql.org/docs/9.5 /transaction-iso.html). Какую версию postgres вы используете? - person Mahmoud Ben Hassine; 30.03.2020
comment
Я использую 12.0 - person sachin; 31.03.2020
comment
Отладил код, похоже, он устанавливает ISOLATION_DEFAULT в качестве уровня изоляции, который read_committed в postgres. Пытался настроить репозиторий заданий, как уже упоминалось, но это дает проблемы, поскольку я использую JPAItemWriter для записи элементов, в которых говорится TransactionRequiredException, транзакция не выполняется. - person sachin; 31.03.2020
comment
По умолчанию SERIALIZABLE: github.com/spring-projects/spring-batch/blob/. Вы должны переопределить его где-нибудь, если у вас есть ISOLATION_DEFAULT при отладке. Теперь это исправлено, чтобы JPAItemWriter работал, вам нужно убедиться, что Spring Batch настроен с помощью JpaTransactionManager, см. stackoverflow.com/questions/22509529 - person Mahmoud Ben Hassine; 31.03.2020
comment
здорово, рад что помогло. - person Mahmoud Ben Hassine; 31.03.2020
comment
Еще один вопрос, если я не настрою репозиторий. Тогда нет TransactionRequiredException. Это должно было быть то же самое для этого .. правильно? - person sachin; 31.03.2020
comment
Теперь я получаю TransactionRequired и в других местах.. кроме пакета - person sachin; 02.04.2020