У меня есть приложение Spring Boot, в котором в настоящее время задание выполняется ежедневно и выполняется, но похоже, что оно запускается дважды и приводит к непреднамеренным побочным эффектам. Задача должна записать в базу данных, и в результате выполнения дважды я получаю сообщение об ошибке на БД.
Эта проблема связана с развертыванием, так как когда я запускаю ее локально, она работает. Если я запускаю другой экземпляр того же приложения локально, я могу симулировать ошибку. Это говорит о том, что что-то в моем контейнере регистрирует задачу дважды.
private void syncData(DatasetProperties dataset, EndPointSync lastSyncResult) {
inProgressSyncs.addDataSet(dataset.getName());
LocalDateTime currentSyncTime = LocalDateTime.now();
DatasetSynchronizationResult currentSyncResult;
Future<DatasetSynchronizationResult> resultFuture = datasetSynchronizationExecutorService
.submit(getCallableForDataset(dataset, lastSyncResult, currentSyncTime));
try {
currentSyncResult = resultFuture.get();
} catch (CancellationException | ExecutionException ex) {
currentSyncResult = DatasetSynchronizationResult
.unexpectedError(dataset.getName(), currentSyncTime);
datasetSynchronizationLogger.logUnexpectedException(log, dataset, ex);
} catch (InterruptedException ex) {
currentSyncResult = DatasetSynchronizationResult
.unexpectedError(dataset.getName(), currentSyncTime);
datasetSynchronizationLogger.logUnexpectedException(log, dataset, ex);
Thread.currentThread().interrupt();
}
inProgressSyncs.removeDataSet(dataset.getName());
datasetSynchronizationLogger.logDatasetSynchronizationResult(
log, lastSyncResult, currentSyncResult);
updateSynchronizationResult(dataset, lastSyncResult, currentSyncResult);
}
Это сообщение об ошибке весенней загрузки:
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:192)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:257)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:223)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:540)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:746)