Java 执行器服务任务在spring boot应用程序中执行两次

Java 执行器服务任务在spring boot应用程序中执行两次,java,spring-boot,executorservice,Java,Spring Boot,Executorservice,我有一个Spring Boot应用程序,它当前有一个任务设置为每天运行并执行一个任务,但它看起来运行了两次,并导致了意外的副作用。该任务必须写入数据库,并且由于运行两次,我在数据库上得到一个错误 这个问题与部署有关,因为当我在本地运行它时,它可以正常工作。如果我在本地启动同一应用程序的另一个实例,我就能够模拟错误。这表明容器中的某些内容正在两次注册任务 private void syncData(DatasetProperties dataset, EndPointSync lastSyncR

我有一个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);
  }

syncData方法是如何调度的?我正在使用接受参数的CronTrigger类。然而,我们在Spring boot中使用的格式是*0****,看起来格式实际上应该是0****。这可能会有所不同吗?
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)