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