Задача «Служба исполнителя», выполняющаяся дважды в весенней загрузке приложения - PullRequest
0 голосов
/ 20 октября 2019

У меня есть приложение 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...